Say I have some strings,
var string1 = "hey this is jack and michael";
var string2 = "hey this is jack and jenny";
And I have an array of strings:
var arr = ['jack', jenny'];
How do you write a function so that:
fn(string2, arr); // true
fn(string1, arr); // false
Kind of like String.indexOf() or regex with a|b|c, but no individually.
渣渣...
function containsAll(haystack, needles){
for (var i = 0; i < needles.length; i++){
if (haystack.indexOf(needles[i]) === -1)
return false;
}
return true;
}
1
ershisi 2016-04-25 15:49:37 +08:00 1
虽然不知道为什么要用英文。你的数组缺少一个闭合。
另外最简单的办法,如果你的字符串都是以空格分隔的。那就把第一个 string 参数分割成数组。然后再去判断。用不着正则的感觉。。。 |
2
Magic347 2016-04-25 15:53:25 +08:00 1
python 版:
def fn(str, arr): ____return all(x in str for x in arr) |
4
spance 2016-04-25 16:27:52 +08:00
这个其实就是多模式匹配,比较好的方法是使用 W-M 或者 A-C 算法可以做到 O(m+n),或者没啥要求或者数量较小就像最后那个 for 里面逐个查找也可以。
|
5
jyyyxy 2016-04-25 17:13:18 +08:00
java 版 BiPredicate<String, List<String>> fun = (str, arr) -> arr.stream().allMatch(str::contains);
|
6
xjp 2016-04-25 19:11:33 +08:00
arr.every((s) => string1.contains(s));
|
7
murmur 2016-04-25 19:16:48 +08:00
AC 自动机 应该有 java 版的
|
8
zhujinliang 2016-04-25 19:25:28 +08:00
javascript:
function containsAll(haystack, needles) { return !!haystack.match(new RegExp('('+needles.join('|')+')')); } |
9
pollow 2016-04-25 19:48:59 +08:00
我还以为进来能看到有人讨论 AC 自动机,没想到一群写循环的……
|
10
7jmS8834H50s975y 2016-04-25 22:21:10 +08:00
VIML
let s:str1 = "hey this is jack and michael" let s:str2 = "hey this is jack and jenny" let s:list = ['jack', 'jenny'] fu! s:checkstr(str,list) if 0 < index(split(a:str,' '),a:list[0]) && index(split(a:str,' '),a:list[0]) < index(split(a:str,' '),a:list[1]) return "true" else return "false" endif endf echom s:checkstr(s:str1,s:list) echom s:checkstr(s:str2,s:list) |