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:鄙人才疏學淺,如有更好算法,還請不吝賜教。如需轉載請標明出處及作者。
轉載于:https://www.cnblogs.com/wanghao111/archive/2011/02/12/1951795.html
總結
以上是生活随笔為你收集整理的Java字符串的子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win7系统下Vmware虚拟机无法使用
- 下一篇: “外部质量”还是“内部质量”