<力扣算法题>面试题 01.05. 一次编辑(从BP到Optimization)
法一(BP)
肝了近1小时,才成功把该BP方法的逻辑整明白,不能不说力扣官方测试用例设计的滴水不漏,
代码如下,欢迎一起讨论 😃
提交的代码: 9 小时前
语言: java
class Solution {
public boolean oneEditAway(String s1, String s2) {
boolean flag = true;
int count = 0;
if(s1.length()==0 && s2.length()==0)return true;
if(s1.length()==s2.length()){// 判断能否一次替换
for(int i=0;i<s1.length();i++){
count += (s1.charAt(i)==s2.charAt(i)) ? 0 : 1;
}
// return (count==1||count==0);
flag = (count==1||count==0)?true:false;
}else{//判断能否一次增删
int index = -1;
// int count = 0;
if(s1.length()==s2.length()-1){
for(int i=0; i<s2.length(); i++){
if(s1.indexOf(s2.charAt(i))==-1 && count==0){
count++;
index = i;
}//else flag = false;
}
System.out.println(index);
if(index==-1){
for(int i=0; i<s1.length(); i++){
if(s2.charAt(i)!=s1.charAt(i)&& count==0){
count++;
index = i;
}//else flag = false;
}
if(count==0)index=s2.length()-1;
}
if(count>1)return false;
System.out.println(index);
flag = sortEqual(s1,s2,index);
}else if(s2.length()==s1.length()-1){
for(int i=0; i<s1.length(); i++){
if(s2.indexOf(s1.charAt(i))==-1 && count==0){
count++;
index = i;
}//else flag = false;
}
if(index==-1){
for(int i=0; i<s2.length(); i++){
if(s2.charAt(i)!=s1.charAt(i)&& count==0){
count++;
index = i;
}//else flag = false;
}
if(count==0)index=s1.length()-1;
}
if(count>1)return false;
//System.out.println(index);
flag = sortEqual(s2,s1,index);
}else flag=false;
// for(int i=0; i<(s1.length()>s2.length()?s1.length():s2.length()); ++i){
//
// }
}
return flag;
}
public static boolean sortEqual(String s1, String s2, int index){
if(index == s2.length()-1){
for(int i=0;i<s1.length();i++){
if(s1.charAt(i)!=s2.charAt(i))
return false;
}
return true;
}else if(index == 0){
for(int i = 1; i < s1.length(); i++){
if(s1.charAt(i-1)!=s2.charAt(i)) // i->i-1
return false;
}
return true;
}else{
for(int i = 0,j=0; i < s1.length(); i++){
System.out.println("here");
if(i<index){
if(s1.charAt(i) != s2.charAt(i))
return false;
}else{
if(s1.charAt(i) != s2.charAt(i+1))
return false;
}
}
return true;
}
// return false;
}
}
BP通过后思考优化然后突发奇想,之前刚做的算法题中用到的双指针(解决了力扣算法题之有序整数数组元素原地去重那道题),我可以把该思路应用到该题中来对两个字符串数组进行对比并作相应操作,写下伪代码后困得不行了,就睡了,今早上起来补上了,成功通过! 😃
源码如下
提交的代码: 3 小时前
语言: java
法一
class Solution {
public boolean oneEditAway(String s1, String s2) {
boolean flag = false;
int l1 = s1.length();
int l2 = s2.length();
if(l1==0 && l2==0)flag = true;
else if(l1==0&&l2==1)return true;
else if(l1==1&&l2==0)return true;
else if(l1==l2){
int count = 0 ;
for(int i=0; i<l1; i++){
if(s1.charAt(i)!=s2.charAt(i))count++;
}
if(count==1 || count==0)flag = true;
else flag = false;
}
else if(l1-l2==-1 || l1-l2==1){
int count = 0 ;
if(l1-l2==-1)
flag = search(s2,s1);
else if(l1-l2==1)
flag=search(s1,s2);
}
else flag = false;
return flag;
}
public static boolean search(String s1, String s2){
// s1.length() = s2.length()+1
int count = 0;
int slow = 0, fast;
for(fast=0;fast<s1.length();fast++){
if(slow==s2.length()){count=1;break;}
if(s2.charAt(slow)==s1.charAt(fast)){
slow++;
}else{
count++;
}
}
boolean flag = false;
if(count>1)flag = false;
else if(fast==slow||fast==slow+1)flag = true;
return flag;
}
}