2017-05-26 73 views
0

晚報,的Java:如何檢查是否字符的字符串中包含

我試圖找到最佳的解決方案來解決這個問題:

輸入:

String1 = "algrtvy"; 
String2 = "alg"; 
String3 = "gvy"; 
String4 = "mgr"; 
String5 = "aall"; 

str2,3,4,5的字符是否包含在1中?

輸出

true 
true 
false 
false 

所以,我不檢查序列(子串),但對於單個字符。

任何提示? 我正在尋找計算時間的禁食解決方案。

解決方案:

該解決方案是從@ davidxxx的回答已實施的版本。

public boolean haveChars(String longerString, String shorterString) { 
    String chars = longerString; 
    for (char c : shorterString.toCharArray()){ 
     int index = chars.indexOf(c); 
     if (index == -1) { 
      return false; 
     } else { 
      chars = chars.substring(0,index) + chars.substring(index + 1); 
     }  
    } 
    return true; 
} 
+0

我不認爲這是因爲OP不需要檢查子重複。 OP檢查子序列。 –

+2

問題陳述有誤導性。 「Contained in」表示子字符串,但「String3」的「true」輸出表明它與單個字符有關。 – jsheeran

+0

它不是重複的@EnzoNocera,我不尋找一個子字符串,我正在尋找字符檢查。 –

回答

1

1)在int值中存儲要在輸入中查找的字符數。 它是允許知道比賽是否成功的計數器。

並且還製作當前模型的副本以匹配。
它不是強制性的,因爲String是不可變的,但它使事情更清晰。

2)對輸入中包含的每個字符進行迭代,嘗試與模型副本匹配。

3)只要字符匹配,減少計數器並將其從模型副本中刪除。

4)只要計數器的值爲0,就意味着輸入和模型匹配。5)如果在輸入字符循環後,計數器的值不是0,這意味着輸入和模型不匹配。

你可以有一個這樣的方法:

public static boolean isMatch(String model, String input) { 

    int nbCharacterRemaningToFind = input.length(); 
    String copyModel = model; 

    for (char c : input.toCharArray()) { 
     String cInString = String.valueOf(c); 

     if (copyModel.contains(cInString)) { 
      copyModel = copyModel.replaceFirst(cInString, ""); 
      nbCharacterRemaningToFind--; 
      if (nbCharacterRemaningToFind == 0) { 
       return true; 
      } 
     } 

    } 

    return false; 
} 
+0

目前這是最好的解決方案,因爲它認爲雙字符。但是O(n^2)...而且我開始猜測這是不可能降低的。 –

+0

錯誤:空字符文字 \t \t \t \t \t remainingCharacters = remainingCharacters.replace(c,''); –

+0

確實。我已經編寫代碼而不檢查其編譯。抱歉。 'Character.MIN_VALUE'應該用於空字符。我編輯提出了一個更簡單的解決方案。 – davidxxx

1

如果字符串是短暫的,你可以只使用

String string = "abcdefgh"; 
String sub = "adf"; 

boolean ok = sub.chars().allMatch(c -> string.indexOf((char) c) >= 0); 

如果M串的大小,N爲子的大小,這是O(N * M)在最壞案件。

如果是大的,或者如果你想要做套用相同的字符串上多次檢查,你可以通過它設置開始,並使用相同的原則:

Set<Character> set = string.chars().mapToObj(c -> ((char) c)).collect(Collectors.toSet()); 
ok = sub.chars().allMatch(c -> set.contains((char) c)); 

這是O( M)+ O(N)。

另一種可能性是使代替一組出子串的:

Set<Character> subset = sub.chars().mapToObj(c -> ((char) c)).collect(Collectors.toSet()); 
for (int i = 0; i < string.length() && !subset.isEmpty(); i++) { 
    subset.remove(string.charAt(i)); 
} 
ok = subset.isEmpty(); 

再次O(M)+ O(N)。

您現在應該測量您的預期輸入。但要小心:Java中的基準測試很難。

+0

謝謝你的回答,但我試圖避免其他數據結構。 –

0

你可以簡單地檢查創建一個新的功能(containsEachChar),檢查了包含這樣的:`

public boolean containsEachChar(String string1, String string2) { 
     for (char c : string2.toCharArray()) { 
      if(string1.indexOf(c) == -1){ 
       return false; 
      } 
     } 
     return true; 
} 
`  

聲明string1.indexOf (c)返回'string1'中'c'的位置。如果'string1'中不存在'c',則返回-1。現在

,你可以從你的主要方法調用上述方法:`

 public static void main(String[] args) { 
     String string1 = "algrtvy"; 
     String string2 = "alg"; 
     String string3 = "gvy"; 
     String string4 = "mgr"; 
     System.out.println(containsEachChar(string1, string2)); 
     System.out.println(containsEachChar(string1, string3)); 
     System.out.println(containsEachChar(string1, string4)); 
    } 

輸出: 真正 真 假

什麼containsEachChar代碼確實是,

  1. 它迭代字符串2中的字符。
  2. 因爲如果值string1.indexOf(c)是-1,檢查字符串2中的更多字符並不是必要的,函數只是返回false。
0

注意這可能是一個低效率的解決方案,但我想在這裏做的是利用containsALL的,如果集合的內容包含在另一個集合

字符串字符串1中,檢查=「 algrtvy「;

//turn it to arraylist 
    List<String> string1ArrayList = Arrays.asList(string1.split("")); 
    String string2 = "alg"; 
    String string3 = "gvy"; 
    String string4 = "mgr"; 
    String string5 = "aall"; 

    //check its in the arraylist 
    System.out.println(string1ArrayList.containsAll(Arrays.asList(string2.split("")))); 
    System.out.println(string1ArrayList.containsAll(Arrays.asList(string3.split("")))); 
    System.out.println(string1ArrayList.containsAll(Arrays.asList(string4.split("")))); 
    System.out.println(string1ArrayList.containsAll(Arrays.asList(string5.split("")))); 

*

results: true true false true

*

+0

那麼你的回答是不正確的,結果應該是:true true false false,但是謝謝! –

+0

是不允許重複的,例如aa只應該匹配一個?在「aall」的情況下, – HummingBird

相關問題