POJ总结(1035)-Java

判断字符串是否可以通过增删改一个字符变成另一个目标字符串

今天写了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();

    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值