双指针+模拟
初始字符串 s s s 已给定,根据 s s s 构造下一个外观数列 t t t ,构造完毕, s = t s=t s=t ,循环 n − 1 n-1 n−1 次,构造出一个外观数列。
构造步骤 :
令
j
j
j 指向当前元素 ,
k
k
k 从
j
j
j 往右,记录
s
[
j
]
s[j]
s[j] 出现的次数,当
s
[
k
]
s[k]
s[k] 不等于
s
[
j
]
s[j]
s[j] ,将
k
k
k 记录的
s
[
j
]
s[j]
s[j] 的次数加入临时串
t
t
t ,令
j
=
k
j=k
j=k ,此时
s
[
j
]
s[j]
s[j] 指向下一个不同元素,循环上述操作。
class Solution {
public:
string countAndSay(int n) {
string s = "1";
for(int i = 0;i<n-1;i++){
string t;
for(int j = 0;j<s.size();){
int k = j + 1;
while(k<s.size()&&s[k]==s[j]) k ++;
t += to_string(k-j) + s[j];
j = k;
}
s = t;
}
return s;
}
};
- 时间复杂度 : O ( n × M ) O(n\times M) O(n×M) , n n n 已给定, M M M 是构造的最长子串 , 最坏时间复杂度 O ( n × M ) O(n\times M) O(n×M) 。
- 空间复杂度 : O ( M ) O(M) O(M) , s s s 的最大长度是 M M M ,对应空间复杂度 O ( M ) O(M) O(M) 。
致语
理解思路很重要!
欢迎读者在评论区留言,答主看到就会回复的。