2014-02-26 43 views
0

我需要比較一些字符串,並檢查是否可以在另一個字符串中找到每個由空格分隔的字段。
某些字段可以在串A不存在,但在任何情況下,字段將是相同的順序檢查字符串上的每個字段是否在另一個字符串中

實施例:

String A: AAA CCC DDD  
String B: AAA BBB CCC DDD 

確定

String A: AAA CCC DDD  
String B: AAA BBB DDD 

也不行

我將使用C#,但一個通用的算法也可以很好

回答

6

您可以在空白處同時使用兩個字符串split,然後使用Enumerable.Except檢查是否有任何不匹配的元素。

if(stringA.Split().Except(stringB.Split()).Any()) 
{ 
    //extra elements present 
} 
+0

謝謝你,這個工作 – Jorgel

0

這是你在找什麼?它檢查源字符串中的每個部分是否在要與之比較的字符串中。

var sourceString = "AAA CCC DDD"; 
var compareTo = "AAA BBB CCC DDD"; 

sourceString.Split(' ').All(x=>compareTo.Contains(x)); 
+0

這其中可能產生假陽性,例如對於'A'和'AA',你應該返回'false',但是你的方法會返回'true',因爲'A'是'AA'的一個子串。 – dasblinkenlight

+0

好吧,發現我的錯 –

0

所以,如果我理解正確結果爲真只有當B包含相同的字段作爲一個以相同的順序與選擇在這裏和 - 插有一些額外的領域。好的算法給出具有至多N個步驟在最壞的情況下,答案其中N是字段中B.

  • 分裂A和B兩者成字段的陣列的數量,並允許命名這些數組作爲FA和FB
  • 讓IA和IB是索引到FA和FB場陣列和兩個初始化爲零
  • 如果FA領域的數量比FB場的數量越多,那麼答案是什麼也不做
  • 立即假
  • 在ia沒有達到FA的長度的情況下,在循環中運行以下內容:如果FA [ia] == FB [ib],那麼只需ia和ib。如果FA [ia]!= FB [ib],則僅步驟ib。如果僅僅步驟ib,那麼檢查FB是否仍然具有與FA一樣多的剩餘元素,因爲如果FB具有更少的剩餘元素,則答案已經是假的(因此如果len(FB)-ib < len(FA)答案是錯誤的)。如果你已經用你的ia迭代了整個FA數組(並且退出循環),並且你還沒有偶然發現導致錯誤返回值的條件,那麼答案是正確的。

僞代碼:

FA = fields of A 
FB = fields of B 
if len(FB) < len(FA): 
    return False 
ia = 0 
ib = 0 
while ia < len(FA): 
    if FA[ia] == FB[ib]: 
     ia += 1 
     ib += 1 
    else: 
     ib += 1 
     if len(FB)-ib < len(FA)-ia: 
      return False 

# we finished with the loop, ia reached len(FA) 
return True 
相關問題