2014-04-24 32 views
0
相同的序列

確定首先在所有我想知道我有多少時間可以找到世界例如「懶惰」知道如果一個字符串包含在Java中

String string1= "The quick brown fox jumps over the lazy dog"; 
String string2= "The lazy brown fox jumps over the lazy dog"; 

我知道使用Java String.contains會工作這兩個字符串,但我怎麼能知道如果在第一個字符串它包含1個「懶」字和第二個字符串2「懶」字,因爲包含它是一個布爾方法,所以在這種情況下,這不是我所需要的。

我想知道如何做到這一點,而不使用正則表達式,因爲我正在學習如何創建一個正則表達式引擎。

+0

*「我可以找到世界」*? – MadProgrammer

+1

你可以使用正則表達式來完成這種任務 – Kakarot

+0

好吧,你的編輯只是徹底改變了這裏的遊戲。儘管你還有其他兩個答案。而且他們都很好。 – rpg711

回答

1

有很多可能的解決方案,但一種方法是做線性搜索並計算你看到它的次數。代碼看起來像這樣。

int countOccurences(String haystack, String needle) { 
    int count = 0; 
    for (int i = 0; i < haystack.length() - needle.length(); i++) 
     if (haystack.substring(i, i + needle.length()).equals(needle)) count++; 

    return count; 
} 
3

這將使用一個非常簡單的正則表達式在一次通過。當然,你也可以將它抽象出來,並使它整潔,整潔。

Pattern p = Pattern.compile("lazy"); 
int occurences; 
Matcher m = p.matcher(string1); //etc 
while(m.find()) 
    occurences++; 
0

這裏的一個更noobie友好的方式來這樣:

public class Yolo { 

    public static void main(String[] args) { 
     String string1= "The quick brown fox jumps over the lazy dog"; 
     String string2= "The lazy brown fox jumps over the lazy dog"; 
     String sx1[] = string1.split("\\ "); 
     String sx2[] = string2.split("\\ "); 
     int count = 0; 
     for (int i = 0; i < sx1.length; i++) { 
      if (sx1[i].equalsIgnoreCase("lazy")) { 
       count++; 
      } 
     } 
     for (int i = 0; i < sx2.length; i++) { 
      if (sx2[i].equalsIgnoreCase("lazy")) { 
       count++; 
      } 
     } 
     System.out.println("Num occurances of lazy = "+count); 

    } 

} 
0

引文從Wikipedia

正則表達式處理器轉換正則表達式到 非確定性有限自動機(NFA) ,然後將其確定爲 並在目標文本字符串上運行以識別墊子的子字符串正則表達式。

如果你真的試圖建立一個正則表達式引擎,你應該瞭解一般的狀態機,語法和編譯器。這非常困難,所以如果你想通過搜索子串開始,最好這樣做。如果構造一個狀態機來搜索子字符串,例如單詞 「懶」 格外,它會是這個樣子:

  • 狀態機將有5種狀態:
    • 「未找到」
    • 「發現L」
    • 「發現LA 「
    • 」發現LAZ「
    • 」發現偷懶「
  • 閱讀CHARAC後轉移到適當的狀態
    • 例如,如果您處於「未找到」狀態,並且您讀取的是L,請轉至「找到L」狀態
    • 例如,如果您處於「找到LAZ」並且您看到Y,請轉到「found LAZY」狀態
    • 例如,如果你在「發現LAZ」和你讀$,進入「未找到」狀態
  • 如果你在
  • 「發現偷懶」的狀態,增加計數器,並返回到「找不到」狀態

狀態自動機這樣做的優點和要點並非不同,因爲您必須遍歷一次字符串才能執行搜索。

相關問題