题目
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。

思路
因为只能通过一次或者零次编辑,所以如果给定字符串的长度大于2的话,那么可以直接返回false;如果两字符串长度相等,那么肯定是通过替换得到的,两个字符串对应位置只能有一个不同的地方,遍历字符串统计对应位置不同的数目即可;如果两字符串长度 相差1,那么可以认为是短的字符串插入一个字符得到长的字符串,采用双指针法,如果两个字符串对应的位置的字符相同,两个指针都+1,如果不同,长的字符串指针加+1,最终两个指针的差值不能超过1.
代码
class Solution {
public:
bool oneEditAway(string first, string second) {
int fl=first.size();
int sl=second.size();
if (fl-sl>1||sl-fl>1) return false;
int count=0;
if(fl==sl){
for(int i=0;i<fl;i++){
if(first[i]!=second[i]) count++;
}
if(count!=0&&count!=1) return false;
}
int fir=0;
int sec=0;
if(fl>sl){
while(sec<sl){
if(first[fir]==second[sec]){
fir++;
sec++;
}
else{
fir++;
}
if(fir-sec>1) return false;
}
}
// if(fir-sec>1) return false;
if(fl<sl){
while(fir<fl){
if(first[fir]==second[sec]){
fir++;
sec++;
}
else{
sec++;
}
if(sec-fir>1) return false; //不能等待循环结束再判断,因为可能造成数组越界
}
}
return true;
}
};
题目
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

代码
class Solution {
public:
string compressString(string S) {
int slen = S.size();
string re;
int k=0;
for(int i=0;i<slen;){
int j=i+1;
while(S[i]==S[j]){
j++;
}
char tmp = j-i;
re += S[i];
re += to_string(j - i);
i=j;
j++;
}
if(re.size()>=slen) return S;
else
return re;
}
};
这题值得注意的一个点在于,拼接字符串 a 和 b 时, 方法 a = a + b 会生成新的 string 对象(耗时高),方法 a += b 是在原对象后直接添加,后者效率更高。
本题如果采用a=a+b的赋值形式,会超时
本文探讨了如何判断两个字符串是否只需一次编辑操作,即插入、删除或替换一个字符就能相互转换。同时,介绍了如何实现基本的字符串压缩方法,将重复字符的数量表示出来。在字符串压缩问题中,需要注意避免使用低效的字符串拼接方式导致超时。这两个问题在字符串处理和算法设计中具有重要意义。
638

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



