Example 1:
Input: n = 1
Output: “1”
Explanation: This is the base case.
Example 2:
Input: n = 4
Output: “1211”
Explanation:
countAndSay(1) = “1”
countAndSay(2) = say “1” = one 1 = “11”
countAndSay(3) = say “11” = two 1’s = “21”
countAndSay(4) = say “21” = one 2 + one 1 = “12” + “11” = “1211”
Constraints:
1 <= n <= 30
这是一个类似于归纳法的问题,
countAndSay(1) = “1”,
后面基于这个归纳,每一步找出连续数字(num)组成的substring中num的个数(cnt),
然后字符串就为cnt + num,这样每个substring的cnt + num接起来,
直到读到第n步.
注意"1211"并不是“3个1,1个2”,而是要看连续的substring,
应该是"1个1,1个2,2个1“ —> ”111221“
思路:
没啥特别的,就是一步一步推,类似归纳法。
先是countAndSay(1) = “1”,
然后我们知道第n-1步的countAndSay(n-1) = s,
再根据s推counAndSay(n).
统计连续数字的个数,
出现不同数字时,在string中加入前面一个数字的cnt + num,
注意不要忘了最后一个数字。
public String countAndSay(int n) {
if(n == 1) return "1";
//第n-1步的字符串
String s = countAndSay(n-1);
char ch = s.charAt(0); //n>=1,所以直接记下第一个数字
int cnt = 1;
StringBuilder sb = new StringBuilder();
for(int i = 1; i < s.length(); i++) {
//遇到新的字母,总结上一字母
if(s.charAt(i) != ch) {
sb.append(cnt);
sb.append(ch);
ch = s.charAt(i);
cnt = 0;
}
cnt ++;
}
sb.append(cnt);
sb.append(ch);
return sb.toString();
}