2016-09-17 43 views
1

我正在用C#編寫一個程序,該程序經過一個單詞列表並確定它們是否可以由用戶輸入的字符串組成。就像拼字遊戲一樣。確定字符串是否由不同字符串中的字符組成(類似拼字遊戲程序)

例如,當用戶輸入字符串「vacation」時,我的程序應該會經歷一個我已經擁有的單詞列表,並且當它到達像「cat」這樣的單詞時應該返回true。所以它不一定要使用所有的字母。

另一個例子可能是「溢出」這個詞,它應該用「over」,「flow」,「low」,「lover」等詞語來返回true。如果輸入單詞重複出現N次,那麼匹配的單詞也可以是該單詞的N次,但不會超過。

我現在有這樣的事情:

var desiredChars = "ent"; 
var word = "element"; 
bool contains = desiredChars.All(word.Contains); 

然而,這種檢查其中是否包含所有的字母。我想檢查它是否只包含那些字母或更少,但只包含那些可以用用戶通過的字母組成的字母。

回答

0

如果不是可能出現多個字母的問題(對於「溢出」,單詞「傻瓜」是匹配,但「哇」不是,因爲字母中沒有兩個w字符集),這Linq的代碼會工作

string letters = "overflow"; 
string word = "lover"; 

bool match = !word.Except(letters).Any(); // unfortunately, not sufficient 

因此,要處理多個信問題,需要這樣的:

var letterChars = letters.ToList(); 
bool match = word.All(i => letterChars.Remove(i)); 

在這裏,我們返回true,只有在字中的所有字母可以成功從字母集合中刪除。請注意,您只需檢查字典中以字母集中的一個字母開頭的單詞。

+0

謝謝!我其實已經嘗試過類似的東西。我把它分解成一個列表/枚舉並且在它上面相交,但是這個邏輯不起作用。這個邏輯非常清晰和易於理解。謝謝! –

0

,對於您的示例工作:

public static bool IsWordPartOfString(string startString, string word) 
    { 
     var tempTable = startString.ToArray(); 

     foreach (var c in word) 
     { 
      var index = Array.FindIndex(tempTable, myChar => myChar == c); 
      if (index == -1) 
      { 
       return false; 
      } 

      tempTable[index] = ' '; 
     } 

     return true; 
    } 

步驟:

1)轉換startString成陣列

2)測試字

3)如炭的迭代字符找不到startString返回false

4)如果startString發現炭發現它在tempTable和刪除,因此 不能重複使用(以防止情況時startString只有一個發生了一封信,但測試的字有多個)

5)如果可能的話遍歷整個單詞,這意味着它可以從初始字符串中的字母構造,因此返回true。

相關問題