一次编辑

题目:一次编辑

  • 题目描述:字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
  • 示例 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,完成插入操作,保持短字符串的指针位置不变,长字符串的指针加到下一位。
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值