2013-01-02 56 views
-4

假設我有兩個字符串a =「a-b-c」,另一個字符串是b =「a-b」。 我想檢查字符串a是否包含字符串b的每個字母。 有幫助嗎?字符串與另一個字符串字符的比較

+1

你可以發佈你有什麼代碼? – Josh

+4

「每個字母」的意思是「每個字符」?角色是否必須以相同的順序發生? –

+0

只是迭代b字符並測試它們是否出現在(使用indexOf) –

回答

0

我假設有幾種方法和命令你可能會得到兩個字符串代表;也就是說,最直接的方法是檢查字符串b中的每個字符是否確實包含在字符串a中。爲此,您可以在String a上輕鬆地撥打indexOf(currentCharFromStringB)

我希望下面的例子可以幫助你看到我的想法:

"Blue Whale".indexOf("Blue") != -1; // true 
"Blue Whale".indexOf("Bloe") != -1; // false 

一些僞代碼將是:

for each char in b 
    for each char in a 
     is a in b? 

現在,它是你的,處理你想怎麼解壓或代表字符串B的每個字符。

我希望這有助於。

1

一個高效的解決方案將把讀入兩個字符串sets。在這樣做後,「b中的每個字符都在」當且僅當bsubseta。它可以優化爲僅使用一個集合(對於b) - 參見僞代碼。

這種方法的複雜性是平均使用散列表O(|a|+|b|),或使用基於樹的最壞情況O(log(min{|a|,|b|})*(|a|+|b|))。如果你搜索每一個角色,它將會比你得到O(|a|*|b|)更簡單。

僞代碼:

setB <- empty set 
for each element e in b: 
    setB.add(e) 
for each element e in a: 
    setB.remove(e) //assuming doing nothing if doesn't exist 
return setB.isEmpty() 

優化的想法是的b元素(字符)加載到一組,然後迭代a而如果遇到從集合中刪除的元素。
一旦你完成迭代a,如果(且僅當)存在b字符,是不是在a - 它會留在設置和算法將返回false

0
function func(a,b) { 
    var alphabet = b.split("-");  
    for (var i=0; i < alphabet.length; i++) { 
     if (a.indexOf(alphabet[i]) == -1) 
      return false; 
    } 
    return true; 
} 

func("a-b-c", "a-b"); 
+1

請注意,這是一個非常低效的解決方案(與替代方案相比),並且在'O(| a | * | b |)運行' 。 – amit

+1

@amit更大的O複雜度並不意味着它更慢,特別是對於短字符串,就像問題中一樣。建立這些套件也會帶來成本。 –

+0

@dystroy:不,對於短字符串沒有,但我敢打賭,任何n> 10它都會。 – amit

0

可以使用以下代碼:

var b = "a-b"; 
var a = "a-b-c"; 
var firstArray = b.split("-"); 
var secArray = a.split("-"); 
var length = firstArray.lenght; 
for(var i =0; i<length; i++) 
{ 
    if(secArray.indexOf(firstArray[i]) != -1) 
    continue; //or do something 
    else 
    break; // or return false. 
}