String - 161. One Edit Distance

时间:2022-07-25
本文章向大家介绍String - 161. One Edit Distance,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  1. One Edit Distance

Given two strings S and T, determine if they are both one edit distance apart.

Have you met this question in a real interview?  Yes

Problem Correction

Example

Example 1:

Input: s = "aDb", t = "adb" 
Output: true 

Example 2:

Input: s = "ab", t = "ab" 
Output: false
Explanation:
s=t ,so they aren't one edit distance apart

思路:

题目意思是两个字符串,通过一次替换或者增加或者删除操作,使得两个字符串相等。增加和删除其实属于一类,因为相对于短的字符串是增加,而长的字符串是减少,所以问题分类为两类。一类是替换,一类是增加删除。替换的在一次遍历的时候,只允许相同位置,出现一次字符不相同,增加和删除也是类似,找出相邻字符不同的情况只允许出现一次。

代码:

java:

 public class Solution {
    /**
     * @param s: a string
     * @param t: a string
     * @return: true if they are both one edit distance apart or false
     */
    public boolean isOneEditDistance(String s, String t) {
        // write your code here
        if (s == null && t == null) return true;
        
        if (s == null || t == null) return false;
        
        int slen = s.length();
        int tlen = t.length();
        
        if (slen == tlen) return isOneChangeDistance(s, t);
        else if (slen - tlen == 1) return isOneRemoveDistance(s, t);
        else if (tlen - slen == 1) return isOneRemoveDistance(t, s);
        
        return false;
    }
    
    private boolean isOneChangeDistance(String s, String t) {
        int len = s.length();
        boolean flag = false;
        for (int i = 0; i < len; i++){
            if (s.charAt(i) != t.charAt(i)) {
                if (flag) {
                    return false;
                } else {
                    flag = true;
                }
            }
        }
        
        return flag;
    }
    
    private boolean isOneRemoveDistance(String s, String t) {
        int len = t.length();
        boolean flag = false;
        
        for (int slow = 0, fast = 0; slow < len; slow++) {
            if (s.charAt(fast) != t.charAt(slow)) {
                if (flag) {
                    return false;
                } 
                flag = true;
                slow--;
            }
            fast++;
        }
        
        return true;
    }
}