2014-02-20 77 views
0

我想查找給定字符串中的子字符串的數量。目前,我的代碼不考慮重疊的字符串。查找字符串中的子字符串發生

例如

SUBSTR = 「CDE」 海峽= 「cdcde」

我的代碼:

public static int ssCount(String str, String substr) { 
    int count = 0; 
    int strlen = str.length(); 
    int substrlen = substr.length(); 
    int numsubstr = 0; 
    int substrpointer = 0; 

    for (int i = 0; i < strlen; i++) { 
     if (str.charAt(i) == substr.charAt(substrpointer)) { 
      substrpointer++; 
      count++; 
     } 
     else { 
      count = 0; 
      substrpointer = 0; 
     } 
     if (count == substrlen) { 
      numsubstr++; 
      count = 0; 
     } 
    } 
    return numsubstr; 
    } 

我嘗試:

public static int ssCount(String str, String substr) { 
     int count = 0; 
     int strlen = str.length(); 
     int substrlen = substr.length(); 
     int numsubstr = 0; 
     int substrpointer = 0; 
     int firstchar = 0; 

     for (int i = 0; i < strlen; i++) { 
      if (str.charAt(i) == substr.charAt(substrpointer)) { 
       substrpointer++; 
       count++; 
       if (str.charAt(i) == substr.charAt(0)) { 
        firstchar = i; 
       } 
      } 
      else { 
       count = 0; 
       substrpointer = 0; 
       i = firstchar; 
      } 
      if (count == substrlen) { 
       numsubstr++; 
       count = 0; 
      } 
     } 
     return numsubstr; 
    } 

我嘗試添加第二個指針將指向子字符串的第一個字符的下一個出現位置爲了繼續從那個點進行比較。但是我遇到了麻煩,因爲我可能遇到一些無限循環。

+0

爲什麼不使用正則表達式和'Matcher'? –

+1

[字符串中子字符串出現的可能的重複](http://stackoverflow.com/questions/767759/occurrences-of-substring-in-a-string) –

+0

你甚至沒有任何問題。不是一個真正的問題,所以投票結束。 –

回答

2

這會在較大的字符串中查找所有重疊的子字符串。正則表達式的非正則表達式方式。一個有趣的問題。

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

/** 
    <P>{@code java OverlappingSubstringsXmpl}</P> 
    **/ 
public class OverlappingSubstringsXmpl { 
    public static final void main(String[] igno_red) { 
     String sToFind = "cdc"; 
     String sToSearch = "cdcdcdedcdc"; 

     System.out.println("Non regex way:"); 

     int iMinIdx = 0; 
     while(iMinIdx <= (sToSearch.length() - sToFind.length())) { 
      int iIdxFound = sToSearch.indexOf(sToFind, iMinIdx); 

      if(iIdxFound == -1) { 
       break; 
      } 

      System.out.println(sToFind + " found at index " + iIdxFound); 

      iMinIdx = iIdxFound + 1; 
     } 

     System.out.println("Regex way:"); 

     Matcher m = Pattern.compile(sToFind, Pattern.LITERAL).matcher(sToSearch); 
     boolean bFound = m.find(); 
     while (bFound) { 
      System.out.println(sToFind + " found at index " + m.start()); 
      bFound = m.find(m.start() + 1); 
     } 
    } 
} 

輸出:

[C:\java_code\]java OverlappingSubstringsXmpl 
Non regex way: 
cdc found at index 0 
cdc found at index 2 
cdc found at index 8 
Regex way: 
cdc found at index 0 
cdc found at index 2 
cdc found at index 8 
+0

通過重疊他意味着類似'pattern =「aba」'和'string =「ababa」'(兩個重疊匹配) –

+0

啊。 OP說「重疊」,但他的例子「cdcde」不重疊。 – aliteralmind

+0

我明白了。我認爲他根本無法獲得任何匹配算法。 –

1

不知道你的問題是什麼,可能是如何解決你的代碼,但我的建議是研究解決這個問題的標準方法,如KMP算法。它也有效地考慮了重疊。

+1

或Z算法,實現起來有點簡單 –