题目:一次编辑
- 题目描述:字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
- 示例 1:
- 输入:
- first = “pale”
- second = “ple”
- 输出: True
- 示例 2:
- 输入:
- first = “pales”
- second = “pal”
- 输出: False
public class OneEdit {
public static void main(String[] args) {
String first = “abc”;
String second = “cba”;
boolean flag = oneEdit(first,second);
System.out.println(flag);
}
public static boolean oneEdit(String first, String second) {
int len1 = Math.max(first.length(),second.length());
int len2 = Math.min(first.length(),second.length());
//len1对应最大长度,first保存最大串
if (len1 - len2 >1){ //长度差大于一返回false
return false;
}else if (len1 == len2){ //长度差相等时,如果不相等的字符大于2,返回false,否则返回true
int count = 0;
for (int i = 0; i < len1; i++) {
if (first.charAt(i) != second.charAt(i)){
count++;
}
}
if (count >= 2){
return false;
}else {
return true;
}
}else {
if (len1 != first.length()){ //len1对应最大长度,first保存最大串
String temp = first;
first = second;
second = temp;
}
boolean flag = false; //标志位是否更改过
int j = 0;
for(int i=0;j<len2;i++ ){ //双指针法,由于second长度最小,让j<second.length,以len2的长度被遍历完为终止条件。
if (first.charAt(i) !=second.charAt(j)){
if (flag){
return false;
}else {
flag = true ;
j += (len1-len2 == 1) ?0:1; //当(len1-len2 == 1)时,二者相差为1,完成插入操作,保持短字符串的指针位置不变,长字符串的指针加到下一位。
}
}else {
j++;
}
}
return true;
}
}
}
/**
1.用len1和len2两个变量存储长度最长的字符串和最短的字符串。
2.如果两者长度差大于1,返回false。如果两个字符串相等,比较字符不相等的数量大于2,返回false,否则返回true。
3. 如果两者相差等于1,让first保存最大字符串,定义一个是否更改过的boolean变量,
采两个指针i和j,由于second长度最小,让j<second.length,以len2长度遍历完为终止条件,
当(len1-len2 == 1)时,二者相差为1,完成插入操作,保持短字符串的指针位置不变,长字符串的指针加到下一位。
*/