Given two strings S and T, determine if they are both one edit distance apart.
给定两个字符串,判断他们是否是一步变换得到的。
在这里需要注意几点:
1、不等于1的变换都要返回false(包括变换次数等于0)。
2、还有很多细节需要注意。
方法如下:
1、直接判断:1)如果差值大于1,直接返回false。
2)如果长度相同,那么依次判断,是否只有一个字母不一样。
3)如果不一样,那么看是否是只是多出了一个字母。
public class Solution { public boolean isOneEditDistance(String s, String t) { int len1 = s.length(); int len2 = t.length(); if (len1 < len2){ return isOneEditDistance(t, s); } if (len1 - len2 > 1){ return false; } boolean flag = false; if (len1 == len2){ for (int i = 0; i < len1; i++){ if (s.charAt(i) != t.charAt(i)){ if (!flag){ flag = true; } else { return false; } } } return flag; } else { int sStart = 0; int tStart = 0; while (tStart < len2){ if (s.charAt(sStart) == t.charAt(tStart)){ tStart++; sStart++; } else { if (!flag){ flag = true; sStart++; } else { return false; } } } return true; } } }
2、利用substring和equals来判断,代码会简洁很多。
public class Solution { public boolean isOneEditDistance(String s, String t) { for (int i = 0; i < Math.min(s.length(), t.length()); i++){ if (s.charAt(i) != t.charAt(i)){ if (s.length() == t.length()){ return s.substring(i + 1).equals(t.substring(i + 1)); } else if (s.length() == t.length() - 1){ return s.substring(i).equals(t.substring(i + 1)); } else { return s.substring(i + 1).equals(t.substring(i)); } } } return Math.abs(s.length() - t.length()) == 1; } }
这两者的速度都差不多,都是2ms左右,答案有一些是1ms,将string换成char[]就可以了,所以就没贴上去的必要了。