2014-05-09 80 views
0

我有2個字符串「test」「bet」和另一個字符串a =「tbtetse」。我需要檢查「tbtetse」是否包含其他兩個字符串。java查找字符串是否包含2個其他字符串

我在想如果我能找到所有的字符串a和anagrams,然後在其中找到其他兩個字符串,但它不會這樣工作,而且我的anagram代碼也無法處理冗長的字符串。

請問您可以通過其他方式來解決問題嗎?

+4

你問是否可以在字母提供或出現的順序找到單詞? – Alcanzar

+0

是詢問字母「tbestse」是否包含單詞「test」和「bet」所需的字母 –

回答

0

查看下面的代碼,它可能會幫助你。

public class StringTest { 

    public static void main(String[] args) { 
     String str1 = "test"; 
     String str2 = "bev"; 
     String str3 = "tbtetse"; 
     System.out.println(isStringPresent(str1, str2, str3)); 
    } 

    private static boolean isStringPresent(String str1, String str2, String str3) { 

     if ((str1.length() + str2.length()) != str3.length()) { 
      return false; 
     } else { 
      String[] str1Arr = str1.split(""); 
      String[] str2Arr = str2.split(""); 
      for (String string : str1Arr) { 
       if (!str3.contains(string)) { 
        return false; 
       } 
      } 
      for (String string : str2Arr) { 
       if (!str3.contains(string)) { 
        return false; 
       } 
      } 
     } 
     return true; 
    } 
} 
+0

對於String [] str1Arr = str1.split(「」) - 你是否試圖將str1放入一個字符串數組中,其中每個索引都有一個字符?我們可以將它保存在字符數組中嗎?只是想明白。 –

+0

是的。你可以嘗試,但如果我將它保存爲'String'數組,然後我得到預定義的字符串方法進行比較,就像我使用'contains()' – Vishrant

+0

我試着用字符數組,但是我不能使用str3。包含查找該字符串中的字符。我需要在那裏找到在str3中找到什麼?我是否需要在字符數組中更改str3?是否有任何數組函數可用於測試它是否包含該字符? –

2

假設你想測試中a字母是否可用於形成測試串testbet的字謎:我建議做字符的字典(HashMap的或其他)從字符串a計數,通過索引字符。爲你正在測試的單詞建立一個類似的詞典。然後確保a至少有來自測試字符串的每個字符的實例。

編輯:Alcanzar建議長度爲26的數組保持計數(每個字母一個槽)。假設你只處理英文字母,這可能比詞典更麻煩。如果您不知道允許的字符數,字典路由是必需的。

0

僞代碼:

讓字符串 「tbtetse」 的副本。

循環「測試」中的每個字符。

  • 做一個indexOf()搜索複製字符串中的字符,如果找到它將其刪除。

  • 如果未找到,則失敗。

對字符串「下注」做同樣的事情。

+0

儘管您不想過早優化,但在開發算法時仍應考慮性能。這是'O(n^2)'而不是'O(n)'。實際上,現在我想到了,它比'O(n^2)'差,因爲'String'是不可變的,「去除」一個字符需要一個完整的副本。 – clcto

+0

然後使用StringBuffer。 – DSoa

+0

這些評論很有幫助,謝謝! –

0

基本上你需要計算兩個字符集,並比較他們

void fillInCharCounts(String word,int[] counts) { 
    for (int i = 0; i<word.length(); i++) { 
    char ch = word.charAt(i); 
    int index = ch - 'a'; 
    counts[index]++; 
} 
} 

int[] counts1 = new int[26]; 
int[] counts2 = new int[26]; 

fillInCharCounts("test",counts1); 
fillInCharCounts("bet",counts1); 
fillInCharCounts("tbtese",counts2); 

boolean failed = false; 
for (int i = 0; i<counts1.length; i++) { 
    if (counts1[i] > counts2[i]) { 
    failed = true; 
    } 
} 

if (failed) { 
    whatever 
} else { 
    something else 
} 

如果您正在推廣它,不要忘了在發送之前對詞叫.toLowerCase()(或修復計數法)。

0
class WordLetter { 
    char letter; 
    int nth; // Occurrence of that letter 
    ... 
} 

一個現在可以使用集

Set<WordLetter> 
// "test" = { t0 e0 s0 t1 } 

然後測試減少設置操作。如果兩個單詞都需要存在,那麼可以測試一個工會。如果兩個單詞必須由單獨的字母組成,則可以測試一組串聯。

相關問題