【问题标题】:comparison of strings with a another string characters [closed]字符串与另一个字符串字符的比较[关闭]
【发布时间】:2012-12-16 23:01:24
【问题描述】:

假设我有两个字符串 a="a-b-c",另一个是 b="a-b"。 我想检查字符串 a 是否包含字符串 b 的每个字母表。

【问题讨论】:

  • 你能发布你有什么代码吗?
  • “每个字母”是指“每个字符”?字符必须以相同的顺序出现吗?
  • 只需遍历 b 个字符并测试它们是否存在于 a 中(使用 indexOf)

标签: javascript jquery algorithm


【解决方案1】:

一个有效的解决方案是将两个字符串读入两个sets字符。这样做之后,“a 中的 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

【讨论】:

    【解决方案2】:

    我假设有几种方法和顺序可以潜在地表示两个字符串;也就是说,最直接的方法是检查字符串 b 中的每个字符是否确实包含在字符串 a 中。为此,您可以轻松地在字符串 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 的每个字符。

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:
      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");
      

      【讨论】:

      • 请注意,这是一个非常低效的解决方案(与替代方案相比),并且在 O(|a|*|b|) 中运行。
      • @amit 更大的 O 复杂性并不意味着它更慢,尤其是对于问题中的短字符串。建造布景也是有代价的。
      • @dystroy:不,对于短字符串不是,但我敢打赌对于任何 n>10 都可以。
      【解决方案4】:

      您可以使用以下代码:

      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.
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2020-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        • 2013-08-06
        相关资源
        最近更新 更多