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:鄙人才疏学浅,如有更好算法,还请不吝赐教。如需转载请标明出处及作者。