思想:迭代枚举即可(当然也可以递归求),这里利用Map来存储之前的结果,也可以用数组也就是dp来实现
时间复杂度O(n*m) m是生成子串的最大长度 ,空间复杂度O(n)
class Solution {
public String countAndSay(int n) {
if(n==1){
return "1";
}
if(n==2){
return "11";
}
Map<Integer,String> map = new HashMap<>();
map.put(1,"1");
map.put(2,"11");
for(int k=3;k<=n;k++){
String preStr = map.get(k-1);
int start = 0;
StringBuilder temp = new StringBuilder();
while(start<preStr.length()){
int end = start;
while(end<preStr.length()&&preStr.charAt(end)==preStr.charAt(start)){
end++;
}
temp.append(end-start);
temp.append(preStr.charAt(start));
start = end;
}
map.put(k,temp.toString());
}
return map.get(n);
}
}
当然也可以采用数组实现
class Solution {
public String countAndSay(int n) {
if(n==1){
return "1";
}
if(n==2){
return "11";
}
String[]dp = new String[n+1];
dp[1] = "1";
dp[2] = "11";
for(int k=3;k<=n;k++){
String preStr = dp[k-1];
int start = 0;
StringBuilder temp = new StringBuilder();
while(start<preStr.length()){
int end = start;
while(end<preStr.length()&&preStr.charAt(end)==preStr.charAt(start)){
end++;
}
temp.append(end-start);
temp.append(preStr.charAt(start));
start = end;
}
dp[k] = temp.toString();
}
return dp[n];
}
}
case3:递归实现
时间复杂度O(n*m) 空间复杂度O(n)
class Solution {
public String countAndSay(int n) {
if(n==1){
return "1";
}
if(n==2){
return "11";
}
String preStr = countAndSay(n-1);
int start = 0;
StringBuilder temp = new StringBuilder();
while(start<preStr.length()){
int end = start;
while(end<preStr.length()&&preStr.charAt(end)==preStr.charAt(start)){
end++;
}
temp.append(end-start);
temp.append(preStr.charAt(start));
start = end;
}
return temp.toString();
}
}