这是我在LeetCode中做到的第一道需要用到递归思想的题目,因为自己对递归掌握的不好,这里做个笔记:
题目大意为我们有一个 Count-and-say 的字符串序列,他的第一个元素是‘1’,后一个元素是读前一个而得到的字符串,比如说这里第二个元素就是“11”意思是一个1,那第三个就是“21”,两个1,第四个元素是“1211”,一个2一个1。
这就有点类似斐波那契数列的感觉了,所以我们可以想到应该用递归的思想去做这题。
AC代码如下:
string read(string s){
string say = "";
int count = 1;
char now = s[0];
for(int i = 1; i < s.size();i++){
if(s[i] == now){
count++;
}else{
char count_char = count + '0';
say = say + count_char + now ;
now = s[i];
count = 1;
}
}
char count_char = count + '0';
say = say + count_char + now ;
return say;
}
string countAndSay(int n) {
string say = "1";
int i = 1;
while(i < n){
say = read(say);
i++;
}
return say;
}
countAndSay函数只是控制递归次数的,
主要函数为read函数。
首先分析read函数里的变量的作用:
say是要返回的字符串,now是我当前读到那个数字,count记录有几个now(也就是有几个我正读到的这个数字连在一起)。
然后遍历s字符串,s字符串就是我要得到的Count-And-Say 字符串元素的前一个元素。
now一开始是s的第一个元素,然后遍历从s[1]开始(也就是第二个元素),看s[1]和now是否一样,一样就count++,如果不一样了,那就说明这个now到此为止了,在else中先把count转为char类型,然后把新的这个now的读法接在原本读好的say后面,即say = say + count_char + now。然后这里要把now变成s[i],count变回1,因为我要开始读下一个数字了。
还有就是记得出循环的时候,最后一个now是还没有在else中被加进say里面的,所以出循环还要有一个say = say + count_char + now。
然后return say就可以了。