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 seq = "1";
int count = 1;
string rs;
int len=1;
while(count != n)
{
for(int j=0;j<seq.size();)
{
string tmp = "s";
tmp[0] = seq[j];
int pos = seq.find_first_not_of(tmp,j);
if(pos==-1)
pos = seq.size();
len = pos-j;
rs += len+'0';
rs += seq[j];
j = j+len;
len = 1;
}
seq = rs;
rs = "";
count++;
}
return seq;
}
};
用了 string::find_first_not_of 不过感觉这个算法复杂度很高 我测试30 就很慢
网上找到了一个也是用了STL的算法 比我这个要精练很多
(原作连接找不到了 但是我保留了 他的作者信息)
<pre name="code" class="cpp">// LeetCode, Count and Say
// @author 连城 (http://weibo.com/lianchengzju)
// 时间复杂度 O(n^2),空间复杂度 O(n)
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();
}
};