A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 klas2008 于 2012-3-25 01:24 编辑

新手提问,请多关照~
在毕老师day13里面StringTest3中,题目是:获取两个字符串中最大相同子串。
有个问题是,假如s1中最大相同字串不止一个(比如ab是,mn也是),应该如何修改下或者添加语句提高程序的健壮性,使应有的最大字串都打印出来呢?

也就是,两个字符串String s1 = "abmn"; String s2 = "abcdefghijklmn"; 运行后结果为ab,如何使其结果为ab与mn?

                代码如下:
class  StringTest3
{
        public static String getMaxSubString(String s1,String s2)
        {

                String max = "",min = "";

                max = (s1.length()>s2.length())?s1: s2;

                min = (max==s1)?s2: s1;
               
//                sop("max="+max+"...min="+min);
                for(int x=0; x<min.length(); x++)
                {
                        for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
                        {
                                String temp = min.substring(y,z);
                               
                                //sop(temp);
                                if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
                                        return temp;   //return ab后就退出了,事实上还有mn
                        }
                }
                return "";
        }


        public static void main(String[] args)
        {
                String s1 = "abmn";   //稍微改了下s1的内容
                String s2 = "abcdefghijklmn";
                sop(getMaxSubString(s2,s1));
        }

        public static void sop(String str)
        {
                System.out.println(str);
        }
}

2 个回复

倒序浏览
本帖最后由 彭盼 于 2012-3-25 11:43 编辑

在getMaxSubString函数中加入一个集合类对象,用以装入多个长度相同的符合对象,再在第一层for循环中加入判断中断语句即可,下面是我修改后的,运行是OK的:

import java.util.*;

class  StringTest3
{
        public static ArrayList getMaxSubString(String s1,String s2)
        {

                String max = "",min = "";

                max = (s1.length()>s2.length())?s1: s2;

                min = (max==s1)?s2: s1;
                                ArrayList bu=new ArrayList();
               
//                sop("max="+max+"...min="+min);
                for(int x=0; x<min.length(); x++)
                {
                                                if(!bu.isEmpty())
                                                        break;

                        for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
                        {
                                String temp = min.substring(y,z);
                                
                                //sop(temp);
                                if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
                                                                bu.add(temp);
                                                               

                                       
                        }
                           //return ab后就退出了,事实上还有mn
                }
                                return bu;

         
        }


        public static void main(String[] args)
        {
                String s1 = "abmn";   //稍微改了下s1的内容
                String s2 = "abcdefghijklmn";
                                ArrayList arr=(ArrayList)getMaxSubString(s1,s2);
                                Iterator it=arr.iterator();

                                while(it.hasNext())
                                {
                                        sop(it.next());
                                }


                                               
                }               

        public static void sop(Object str)
        {
                System.out.println(str);
        }
}
回复 使用道具 举报
哦,我明白了,集合类的对象用于存储当前外循环下内循环中依次取得的最大相同字串,
而外循环里加入的判断语句就是当集合类对象存储不为空(即已有上次取得的所有最大字串)时,就跳出循环,这样即取得了所有存在的最大相同字串,又不会取出更小的字串。
挺好的。O(∩_∩)O谢谢啦!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马