2013-01-02 201 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. 
} 
相关问题