leetcode-程序員面試金典-字符串比較

字符串有三種編輯操作:插入一個(gè)字符、刪除一個(gè)字符或者替換一個(gè)字符。 給定兩個(gè)字符串,編寫一個(gè)函數(shù)判定它們是否只需要一次(或者零次)編輯。
示例 1:
輸入:
first = "pale"
second = "ple"
輸出: True
示例 2:
輸入:
first = "pales"
second = "pal"
輸出: False
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/one-away-lcci
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

看完之后,立刻根據(jù)三種情況開始處理.....

insert和delete都是使用的之前回文序列的較為繁瑣的去重方法搞定的,bug來(lái)源就這里了。

也怪我沒(méi)怎么好好理解題的意思,英文版的更好明白一點(diǎn),只能是“one/zero edit”才能返回true,其他情況統(tǒng)統(tǒng)是false。
這樣的話對(duì)字符串的匹配程度應(yīng)該要求很高,insert和delete的處理過(guò)于粗糙了。

class Solution {
    //采用回文的去重思路判斷insert和delete
    Set<Character> set_in = new HashSet<>();
    Set<Character> set_delete = new HashSet<>();

    public boolean oneEditAway(String first, String second) {

        //判斷replace情況時(shí)候使用兩個(gè)索引
        //分別指向index1和index2
        int index1;
        int index2;

        int count=0;
        index1=index2=0;

    String newstring= new String();
        //連接兩個(gè)字符串
        newstring = first;
        //字符串中應(yīng)該至多有一個(gè)重復(fù)字符
        newstring = newstring.concat(second);

        //轉(zhuǎn)換成字符數(shù)組
        char[] chars_in = newstring.toCharArray();
        char[] chars_del = newstring.toCharArray();

        /**
         * 如果是需要插入一次*/
        if(first.length()==second.length()-1){

            for(Character character: chars_in){
                if(!set_in.contains(character))
                    set_in.add(character);
                else set_in.remove(character);
            }
        }
        /**
         * 如果是需要?jiǎng)h除一次
         * */
        else if(first.length()==second.length()+1){

            for(Character character: chars_del){
                if(!set_delete.contains(character))
                    set_delete.add(character);
                else set_delete.remove(character);
            }
        }
        /**
         * 如果是長(zhǎng)度相等**/
        else  if(first.length()==second.length()){

            //先判斷是否是完全相等
            if(first.equals(second))
                return true;
                //判斷replace數(shù)量
            else
                while(index1<first.length()||index2<second.length())
                {
                    if(first.charAt(index1)!=second.charAt(index2))
                    {
                        count++;
                    }
                    index1++;
                    index2++;
                }
        }

        if(set_in.size()==1) return true;
        if(set_delete.size()==1) return true;
        //如果count==1 return true ,else false
        if(count==1) return true;

        return false;
    }
}

然后測(cè)試不通過(guò),看到用例我才傻眼了

first: teacher
second: detacher
這。。set去重完全搞不定啊
徹底傻眼.jpg
os:insert和replace你給我混用???

這樣的情況下字符串完美匹配就非常重要了,因?yàn)閺臏y(cè)試用例知道不能僅僅要求字符串的字符元素匹配,還得要求字符順序也匹配。

最后采用雙索引方法通過(guò),用時(shí)2ms

class Solution {


    public boolean oneEditAway(String first, String second) {

        int i,j,k;
        i=0;
        k=first.length()-1;
        j=second.length()-1;

        //必定為錯(cuò)的情況
        if(Math.abs(k-j)>1) return false;

        char[] charsf = first.toCharArray();
        char[] charss = second.toCharArray();

        //雙指針,從字符串的兩端開始匹配
        //兩個(gè)字符串最少需要三個(gè)index
      
        //指針移動(dòng)的true condition:首尾指針相遇
        //指針移動(dòng)時(shí)候必須保證兩個(gè)字符串指針的同步移動(dòng)
        while(i<first.length() && i<second.length() && charsf[i] == charss[i])
        {
            i++;
        }
        //踩坑記錄:索引千萬(wàn)不要寫反了!!
        while(k>=0 && j>=0 && charsf[k]==charss[j]){
            k--; j--;
        }
        if(k-i<1&& j-i<1)
        return true;
        else return false;

    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容