Java字符串的子串

老婆公司有一项目用到了一方法,老婆年前想了想没写出来,年后也没时间想了,就扔给我了,闲来无事写了一下。下面是题目和算法及代码,仅供参考。

题目:写一个方法,求已给字符串(大写字母)的所有子串(无排列顺序),例:给定字符串ABC,则其所有子串为A,B,C,AB,AC,BC,ABC,若给定的参数为一个字符(一个大写字母),则要求输出其前面的所有字母,例:给定参数C,则结果应为A,B,C。

主要思路:

给定一个字符串其长度固定,所以它的子串的长度最长也就是其本身的长度,它的子串的长度无非是从1到其自身的度,举例说明:

例如:ABCDE,长度为5,它的子串的长度是从1到5,长度为1的有A,B,…,长度为2的有AB,AC,…,长度为3的有ABC,ABD,…,长度为4的有ABCD,ABCE,…,长度为5的也就是其自身ABCDE.

先看其长为4的子串,有BCDE,ACDE,ABDE,ABCE,ABCD,之所以按这个顺序写子串是有原因的,你能发现有什么规律吗?

每个子串相对于“父”字符串,都少了一个字母,分别少了A,B,C,D,E,也就是“父”字符串的每个字符,删除“父”字符串的每个字符一次之后,得到的就是ABCDE长度为4的所有子串,那么长度为3的,为2,为1的子串如何得到呢?以此类推,长度为三的子串必定是长度为4的子串的子串,所以将长度为4的子串暂且作为“父”串求得的长度为3的子串,肯定是ABCDE长度为3的所有子串,由此可见,长度为N的子串,可以通过长度为N+1的子串作为“父”串,删除其每个字符来得到。

通过以上分析,采用递归方式,循环处理字符串,即可得到结果。

代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.lang.*;

public class StringCombination
{
    public static ArrayList<String> arrResult = new ArrayList<String>();  //保存结果
    public static void main(String [] args)
    {
        try
        {
            strCombination("E");  
            Collections.sort(arrResult);   //简单排序,方便查看结果
            //输出结果
            for(int i = 0;i<arrResult.size();i++)
            {
                System.out.println(arrResult.get(i));
            }
            System.out.println("Count:"+arrResult.size());  //输出子串个数
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }

    /*主要方法strCombination
    *参数:字符串或某个字母
    *结果保存在arrResult中
    */
    public static void strCombination(String str)
    {
        int len = str.length();     //获得字符串长度
        String temp = "";
       
        if(len>1)  //字符串
        {
            for(int i = 0;i < len;i++)
            {
                StringBuffer sb = new StringBuffer(str);  //使用StringBuffer,为了删除字符串中的某一字符
                sb.deleteCharAt(i);
                temp = sb.toString();
                strCombination(temp);   //递归
            }           
        }
        else if(len==1 && arrResult.size()==0)  //单个字母
        {
            int acs = 0;
           
            //大小写处理
            if(str.charAt(0)>'A' && str.charAt(0)<'a')
            {
                acs = 65;
            }

            //小写处理
            //if(str.charAt(0)>'a')
            //{
            //      acs = 97;
            //}

            //使用ACSII码,判断查找所给字母前的所有字母
            for(int i = str.charAt(0);i>=acs;i--)
            {
                char ch = (char)i;
                arrResult.add(String.valueOf(ch));
            }   
        }

        //如果子串没有保存在arrResult中,则添加到arrResult中
        if(!(arrResult.contains(str)))
        {
            arrResult.add(str);
        }       

        return;
    }
}

 

PS:鄙人才疏学浅,如有更好算法,还请不吝赐教。如需转载请标明出处及作者。

posted @ 2011-02-12 08:01  回忆1919  阅读(2656)  评论(0编辑  收藏  举报