判断字符串是否可以通过增删改一个字符变成另一个目标字符串
今天写了POJ1035-Spell checker,原题请见
Spell-checker
题目其实比较简单,但是好久没有写代码了,大脑愚钝,不知道怎么判断一个字符串是否可以通过另一个字符串增删一个字符得到。学习了之后总结如下:
1.两个字符串A和B,从头开始比较A和B;
2.当遇到不同的字符或比较结束时进入第三步
3.如果是比较结束两个字符串各位置字符全部相等;即正确
4.如果遇到不同字符后:
4.1若A和B的长度一样,说明A修改这个不同字符即可和B相同,也说明从下一个字符开始,两个字符串又是相等的
4.2若A的长度=B长度-1,说明A删除一个字符和B相同,也说明从A从下一个字符开始,与B从当前字符开始,所有字符是相同的
4.3若A的长度=B长度+1,说明A增加一个字符和B相同,也说明从B的下一个字符开始,与A从当前字符开始,所有字符是相同的
很简单的一个内容,我写的有点复杂。
直接贴代码,代码我自己运行时正确的,但是submit之后runtime-error,还没有弄清楚原因,还请指点
更新—————————————————————–
oj常见错误分析
从这上边可以找到oj判错的原因。
这次的runtime-error是同学提供的思路
首先看样例过了没。。
如果样例过了说明算法大体上没问题
就是某些边界值没考虑到
于是设计了一组样例,发现有数组越界,于是修改代码即可。
import java.util.*;
public class SpellMain {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
ArrayList<String> arraylista=new ArrayList<String>();
String string="";
if(sc.hasNextLine()){
string=sc.nextLine();
}
while(!string.equals("#")){
arraylista.add(string);
if(sc.hasNextLine()){
string=sc.nextLine();
}
}
ArrayList<String> arraylistb=new ArrayList<String>();
if(sc.hasNextLine()){
string=sc.nextLine();
}
while(!string.equals("#")){
arraylistb.add(string);
if(sc.hasNextLine()){
string=sc.nextLine();
}
}
Iterator<String> iteratorb=arraylistb.iterator();
while(iteratorb.hasNext()){
ArrayList<String> result=new ArrayList<String>();
int flag=0;
String b=iteratorb.next();
Iterator<String> iteratora=arraylista.iterator();
while(flag==0&&iteratora.hasNext()){
String a=iteratora.next();
if(a.length()>=(b.length()-1)&&a.length()<=(b.length()+1)){
int j=0;
while((j<b.length()&&j<a.length())&&(a.charAt(j)==b.charAt(j)))j++;
//相等
if(j==b.length()&&(a.length()==b.length())){
flag=1;
System.out.println(b+" is correct");
}
//替换
else if(a.length()==b.length()){
j++;
//System.out.println(j);
while(j<b.length()&&a.charAt(j)==b.charAt(j))j++;
if(j==b.length())result.add(a);
}
//删除
else if(a.length()==b.length()-1){
j++;
while(j<b.length()&&a.charAt(j-1)==b.charAt(j))j++;
if(j==b.length())result.add(a);
}
//插入
else if(a.length()==b.length()+1){
while(j<b.length()&&a.charAt(j+1)==b.charAt(j))j++;
if(j==b.length())result.add(a);
}
}
}
if(flag==0){
System.out.print(b+": ");
if(!result.isEmpty()){
Iterator<String> iterator=result.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
}
System.out.println();
}
}
sc.close();
}
}