解题思路:
(1)既然要使用原地算法,那么这里设置三个指针i,start,end
(2)i表示当前字符串的位置,start表示目标字符串的末尾,end用来判断连续相等字符的迭代
class Solution {
public:
int compress(vector<char>& chars) {
int i=0,start=0,end,count;
string str;
while(i<chars.size()) {
if(i+1<chars.size()) {
if(chars[i]!=chars[i+1]) {
chars[start]=chars[i];
i++;
start++;
}
else {
chars[start]=chars[i];
end = i+1;
count = 1;
while(end<chars.size()&&chars[i]==chars[end]) {
end++;
count++;
}
str = to_string(count);
for(auto&& c:str) chars[++start]=c;
i=end;
start++;
}
} else {
chars[start]=chars[i];
i++;
start++;
}
}
//chars.erase(chars.begin()+start,chars.end());
//return chars.size()
return start;
}
};
(3)LintCode
class Solution {
public:
/**
* @param originalString: a string
* @return: a compressed string
*/
string compress(string &chars) {
int i=0,end,count;
string str="";
while(i<chars.length()) {
if(i+1<chars.length()) {
if(chars[i]!=chars[i+1]) {
str = str + chars[i];
str = str + '1';
i++;
}
else {
str = str + chars[i];
end = i+1;
count = 1;
while(end<chars.length()&&chars[i]==chars[end]) {
end++;
count++;
}
str = str + to_string(count);
i=end;
}
} else {
str = str + chars[i];
if(i!=chars.length()-1) str = str + '1';
i++;
}
}
return str.length()<chars.length()?str:chars;
}
};

本文详细介绍了一种原地字符串压缩算法的实现思路,通过设置三个指针进行迭代,有效地处理了连续相等字符的压缩,并提供了两个不同场景下的代码示例,包括使用vector和string类型的数据结构。
1266

被折叠的 条评论
为什么被折叠?



