用任意顺序的字符串数组匹配字符串

Match string with array of string in any order

本文关键字:字符串 数组 任意 顺序      更新时间:2023-09-26

我的输入是一个字符串,它可以是人的名字、姓氏、组合,甚至是两者的一部分,以特定的顺序

Class {
    first = 'John'          //  just simple string
    last = 'Smith'          //  just simple string
    middle = 'Mark Bill'    //  this is often empty string, but may contain multiple, divided by spaces. ('' or 'Mark Bill')
    hasPresent(what){
        return true || false
    }
}

如果用户的输入是"John",我们的John的hasPresent方法应该返回true
其他情况下:

"input" => expected result
"Smith" => true
"mark" => true
"John Mark" => true
"hn mar" => true
"m" => true
" " => true
"John John" => false
"John Mark John" => false
"Jo Mark" => false
"John rk" => false
"n n n" => false

为了更好地理解,想象一下,你可以把人名按任何顺序排列,只要你只用一次。然后将其与˙indexOf˙函数进行匹配。这就是为什么˙"约翰·rk"˙是假的,不管你怎么努力,你都可以把˙"约翰·rk"˙按这个特定的顺序串起来。你可以有"约翰·马克"˙,但这与˙indexOf˙不匹配。

从我们的名字中,我们可以匹配任何匹配以下字符串

的内容
"John Smith Mark Bill","John Mark Smith Bill","John Bill Smith Mark","John Mark Smith Bill","John Smith Bill Mark", "John Mark Bill Smith" etc



我认为,创建数组与所有名称(第一,最后,和分隔的中间名)和匹配所有可能的组合可以走的路,但由于这必须做之前,我想知道是否有一个更好的方法。

如果没有更好的方法,如何以尽可能少的处理能力从数组中获得所有可能的组合?

您可以concat所有名称,并且对于用户输入的每个单词,检查它是否出现在字符串中。

first = 'John';
last = 'Smith';
middle = 'Mark Bill';
searchStr = first + " " + middle + " " + last;
function hasPresent(param){
  searchLower = searchStr.toLowerCase();
  searchWords = param.toLowerCase().split(" ");
  for (i = 0; i < searchWords.length; i++){
    index = searchLower.indexOf(searchWords[i])
    if (index == -1){
      return false;
    }
    searchLower = searchLower.substring(0,index) + searchLower.substring(index + searchWords[i].length, searchLower.length);
  }
  return true;
}

对于您的示例将返回true,对于像" john Smi"这样的示例也将返回true,但是区分大小写。如果需要,您可以调整它使其不区分大小写。

如果你有一个完整的字符串,你可以检查int indexOf(String str),如果它是-1以外的任何东西,你知道字符串包含单词。如果您想将一个数组转换成这个长字符串,只需执行

这样的操作
for (int i = 0; i < strArray.length; i++)
{
    someStr += strArray[i];
}

然后检查someStr.indexOf("John");

编辑,更新

就像你在

上做indexOf一样
var fullname = "John Mark Bill Smith";
var checkname = fullname.toLowerCase().indexOf(input.toLowerCase()) !== -1;

var fullname = "John Mark Bill Smith";
var check = function(input) {
  return fullname.toLowerCase().indexOf(input.toLowerCase()) !== -1
}
console.log(check("Smith")
           , check("mark")
           , check("John Mark")
           , check("hn mar")
           , check("m")
           , check(" ")
           , check("John John")
           , check("John Mark John")
           , check("Jo Mark")
           , check("John rk")
           , check("n n n")
           )

这就是美。

hasPresent(what:string|number):boolean {
    if(isNumber(what)){
        return this.tel.hasPresent(what)
    }else{
        if (this.tel.hasPresent(what)) {
            return true
        }else{
            var query = what.toString().toLowerCase().split(' ')
            var possible = this.name.toLowerCase().trim().split(' ')
            if(query.length > possible.length){
                return false    //  No way this could be met
            }
            for (var i = possible.length - 1; i > 0; i--) {
                var possible2 = this.name.toLowerCase().trim().split(' ')
                if(possible[i].hasPresent(query[0])){
                    if (query.length==1){
                        return true
                    }
                    possible2.remove(possible[i])
                    for (var j = 1; j < query.length; j++){
                        var passed = false
                        for (var k = possible2.length - 1; k > 0; k--) {
                            if(possible2[k].indexOf(query[j]) == 0){
                                possible2.remove(possible2[k])
                                passed = true
                                break
                            }
                        }
                        if(!passed){
                            break
                        }
                    }
                    if(passed){
                        return true
                    }
                }
            }
            return false
        }
    }
}

注:

Array.remove(object) - removes object for array
Array|String.hasPresent(needle) - shortcut for indexOf(needle) => 0