【问题标题】:Test If String Contains All Characters That Make Up Another String测试字符串是否包含构成另一个字符串的所有字符
【发布时间】:2016-07-23 19:29:55
【问题描述】:

我正在尝试使用 Javascript 来查看某个字符串是否包含构成另一个字符串的所有字符。

例如,单词“hello”包含构成单词“hell”的所有字符。此外,“hellowy”一词包含构成“yellow”一词的所有字符。

最重要的是,无论两个字符串中的字符顺序如何,该方法都需要工作。此外,字符数也很重要。 “Hel”不包含构成“hell”的所有字符。这严格指的是字符数:一个需要两个 l 来组成单词“hell”,而“hel”只有一个。

进一步澄清这个问题,我不担心在从字符串的字符组成子字符串之后是否留下一些“未使用”的字符。也就是说,“hell”仍然应该包含“hell”这个词的所有字母。

我怎样才能有效地做到这一点?也许有一个正则表达式解决方案?速度有点问题,但不是绝对关键。

【问题讨论】:

  • ""Hel" 不包含构成"hell"的所有字符。""hel" 确实包含构成 "hell" 的所有字符。你的意思是区分大小写吗?
  • 没有。只看字数。你需要两个 l 来组成“hell”这个词,而“hel”只有一个。
  • 注意,这是一个重要的要求,似乎没有包含在原始问题中?您应该能够检查输入字符串 .length 是否等于匹配字符串 .length
  • 我现在补充一下。

标签: javascript regex string algorithm


【解决方案1】:

你可以使用every:

function test(string, substring) {
    var letters = [...string];
    return [...substring].every(x => {
        var index = letters.indexOf(x);
        if (~index) {
            letters.splice(index, 1);
            return true;
        }
    });
}

Every 将在第一个假值中失败,然后它不会搜索 每个 字母。

【讨论】:

  • 这个符号有什么作用? [...string]
  • 另外,Set 是内置的 JS 功能吗?
  • 知道了。如果不允许重复,这仍然有效吗?也就是说,如果 string = "hel"substring = "hell" 函数应该返回 false。换句话说,字符数很重要。
  • @MadPhysicist。例如:((new Set).add, mySet)
  • @guest271314 目前您或我无能为力。另外,这就是为什么我对所有试图回答我问题的人投票。
【解决方案2】:

如果字母的数量很重要,那么可能是这样的:

function test(string, substring) {
    var regexp = new RegExp(substring.split("").sort().map(function(s) { return s + "+"; }).join(""));
    return regexp.test(string.split("").sort().join(""));
}

这比上面的答案慢,但是如果字符串中有一些重复,那么可以缓存并获得比其他答案更好的速度性能:

var cache1 = { };
var cache2 = { };
function test2(string, substring) {
    var regexp = cache1[substring];
    if (!regexp) {
        regexp = new RegExp(substring.split("").sort().map(function(s) { return s + "+"; }).join(""));
        cache1[substring] = regexp;
    }

    var string2 = cache2[string];
    if (!string2) {
        string2 = string.split("").sort().join("");
        cache2[string] = string2;
    }

    return regexp.test(string2);
}

【讨论】:

    【解决方案3】:

    编辑、更新

    此外,字符数很重要。 “Hel”不包含 组成“地狱”的所有字符。

    您可以使用变量存储Boolean 值、for..of 循环、String.prototype.indexOf() 检查、设置Boolean 变量、break 循环如果false

    您还应该能够在if 条件下检查输入字符串.length 是否等于匹配字符串.length,如果两个字符串.length 属性不相等,则将变量设置为false

    var str = "hell";
    var match = "hel";
    var bool = true; 
    for (var prop of str) {
      if (str.length !== match.length || match.indexOf(prop) === -1) {
        bool = false; break;
      }
    };
    console.log(bool); // false
    

    【讨论】:

      【解决方案4】:

      做一些训练我想出了这个东西:

      function test(str, substring) {
        var arr_str = str.toLowerCase().split('');
        var arr_substr = substring.toLowerCase().split('');
      
        return arr_substr.filter(function(each) {
          return arr_str.indexOf(each) === -1;
        }).length === 0;
      }
      
      console.log(test("Alien", "line")); // true
      console.log(test("Hello", "hello")); // true
      console.log(test("hello", "hey")); // false
      

      【讨论】:

        猜你喜欢
        • 2018-08-10
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-13
        • 1970-01-01
        • 2015-06-18
        相关资源
        最近更新 更多