The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, ...
1
is read off as "one 1"
or 11
.
11
is read off as "two 1s"
or 21
.
21
is read off as "one 2
, then one 1"
or 1211
.
Given an integer n, generate the nth sequence.
Note: The sequence of integers will be represented as a string.
解法一:
class Solution {
public:
string countAndSay(int n) {
string s("1");
while (--n)
s = getNext(s);
return s;
}
string getNext(const string s) {
stringstream ss;
for (auto i = s.begin(); i != s.end(); ) {
auto j = find_if(i, s.end(), bind1st(not_equal_to<char>(), *i));
ss << distance(i, j) << *i;
i = j;
}
return ss.str();
}
};
解法二:
class Solution {
public:
string countAndSay(int n) {
string temp, result;
result.push_back('1');
char currentChar;
int count;
for(int i = 1; i < n; i++) {
temp = result;
result.clear();
currentChar = temp[0];
count = 1;
for(int j = 1; j < temp.size(); j++) {
if(temp[j] == currentChar) {
count++;
}
else {
result.push_back('0' + count);
result.push_back(currentChar);
currentChar = temp[j];
count = 1;
}
}
result.push_back('0' + count);
result.push_back(currentChar);
}
return result;
}
};