Leetcode day8 一次编辑+压缩字符串

本文探讨了如何判断两个字符串是否只需一次编辑操作,即插入、删除或替换一个字符就能相互转换。同时,介绍了如何实现基本的字符串压缩方法,将重复字符的数量表示出来。在字符串压缩问题中,需要注意避免使用低效的字符串拼接方式导致超时。这两个问题在字符串处理和算法设计中具有重要意义。

题目

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

思路

因为只能通过一次或者零次编辑,所以如果给定字符串的长度大于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的赋值形式,会超时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值