数组排列/组合

时间:2019-07-08 15:50:30

标签: javascript arrays string algorithm

我正在尝试找到检查字符串是否为

的最佳方法
  1. 等于单个索引处的数组值。
  2. 等于数组的排列
  3. 等于值的任意组合。  
    3.1这可以包括数组值和单词之间的空格的组合。  
    3.2这可以包括数组值的组合,单词之间没有空格。
  4. 他们自己的数组值没有空格或特殊字符
  5. 每个数组的值都是唯一的。没有重复的值。
  6. 字符串中的单词永远不要超过两个。
  7. 字符串中永远不会包含特殊字符,但是可以有空格。

有什么想法吗?

示例数据:

var stringExample = "application Name";

var arrayExample = ['app', 'application', 'name'];

伪装:

for (var i = 0; i < arrayExample.length; i++) {
     if (stringExample.toLower() == arrayExample[i]) {
          return true;
     } elseif (stringExample.toLower() == "Any Combination of array values with spaces or
                       without spaces in between") { return true };
}

2 个答案:

答案 0 :(得分:1)

很显然,输入字符串中的一个单词可能需要两个或多个数组元素的串联才能被视为匹配项。这可能是要求中最棘手的部分。

第二,似乎一旦单词与数组值(或数组值)匹配,这些数组元素就不应再用于其他匹配。

我建议使用一个普通对象将数组值存储为属性。这将允许快速查找,并且删除(为了满足上述第二点)也可以非常有效地完成。为了实现第一个要求,我会坚持使用蛮力方法。另外,您可以构建一个suffix tree,但是要想从中受益,您需要大量的投入,因此我不建议这样做。

找到单词(一部分)的潜在匹配项之后,您可以使用递归找到较小问题的解决方案。

这里是实现这些想法的EcmaScript 3解决方案:

function match(str, arr) {
    var words = str.toLowerCase().split(/\s+/);
    var keys = {};
    for (var i = 0; i < arr.length; i++) keys[arr[i].toLowerCase()] = 1;

    function recur(i) {
        if (i >= words.length) return true;
        var word = words[i];
        if (keys[word]) { // Try full match first - relatively fast operation
            keys[word] = 0;
            if (recur(i+1)) return true;
            keys[word] = 1; // backtrack: restore key
        } else { // Try partial match - relatively slow operation
            for (var key in keys) {
                if (!keys[key] || word.slice(0, key.length) !== key) continue;
                keys[word] = 0;
                words[i] = word.slice(key.length);
                if (recur(i)) return true;
                words[i] = word; // backtrack: restore word
                keys[word] = 1; // backtrack: restore key
            }
        }
        return false;
    }
    return recur(0);
}

var str = "application Name";
var arr = ['nam', 'me', 'applica', 'app', 'lication', 'na'];
console.log(match(str, arr));

答案 1 :(得分:0)

因此,如果将完整的字符串及其部分用空格分开,则非常容易:

var stringExample = "application Name";
var example2 = "app King";
var example3 = "application";
var example4 = "some random string";
var arrayExample = ['app', 'application', 'name'];

function findMatch(string, array){
  var a1 = string.toLowerCase().split(" ");
  var match = false;
  // create array simply to check for each string part if it is in the array
  var matches  = [];
  for(var j = 0; j < a1.length; j++){
    matches.push(false);
  }
  for(var i = 0; i < array.length; i++){
    // Checking for complete Match
    if(string.toLowerCase() === array[i].toLowerCase()){
      match = true;
      break;
    }
    // Checking for partly matches
    for(var j = 0; j < a1.length; j++){
      if(a1[j] === array[i].toLowerCase()){
        matches[j] = true;
      }
    }
  }
  // if all parts of the string have a match, return true
  if(matches.every(function(b){return b === true;})){
    match = true;
  }
  return match;
}

console.log(stringExample + " does match: " + findMatch(stringExample, arrayExample));
console.log(example2 + " does match: " + findMatch(example2, arrayExample));
console.log(example3 + " does match: " + findMatch(example3, arrayExample));
console.log(example4 + " does match: " + findMatch(example4, arrayExample));