我是 JavaScript 世界的新手。正如标题所提到的,我想知道 JavaScript 中是否有任何预先构建的方法来查找给定字符串的所有可能排列。
例如,给定输入:
the
期望的输出:
the
teh
eht
eth
het
hte
我是 JavaScript 世界的新手。正如标题所提到的,我想知道 JavaScript 中是否有任何预先构建的方法来查找给定字符串的所有可能排列。
例如,给定输入:
the
期望的输出:
the
teh
eht
eth
het
hte
//string permutation
function permutation(start, string) {
//base case
if ( string.length == 1 ) {
return [ start + string ];
} else {
var returnResult = [];
for (var i=0; i < string.length; i++) {
var result = permutation (string[i], string.substr(0, i) + string.substr(i+1));
for (var j=0; j<result.length; j++) {
returnResult.push(start + result[j]);
}
}
return returnResult;
}
}
permutation('','123') 将返回
[“123”、“132”、“213”、“231”、“312”、“321”]
function permutations(str){
if (str.length === 1)
return str;
var permut = [];
for (var i=0; i<str.length; i++){
var s = str[0];
var _new = permutations(str.slice(1, str.length));
for(var j=0; j<_new.length; j++)
permut.push(s + _new[j]);
str = str.substr(1, str.length -1) + s;
}
return permut; }
permutations('the');
//输出返回:[ 'the', 'teh', 'het', 'hte', 'eth', 'eht' ]
没有预构建,但可以编写这样的函数..这是使用两个函数的一种相对简单的方法:
function FindAllPermutations(str, index, buffer) {
if (typeof str == "string")
str = str.split("");
if (typeof index == "undefined")
index = 0;
if (typeof buffer == "undefined")
buffer = [];
if (index >= str.length)
return buffer;
for (var i = index; i < str.length; i++)
buffer.push(ToggleLetters(str, index, i));
return FindAllPermutations(str, index + 1, buffer);
}
function ToggleLetters(str, index1, index2) {
if (index1 != index2) {
var temp = str[index1];
str[index1] = str[index2];
str[index2] = temp;
}
return str.join("");
}
用法:
var arrAllPermutations = FindAllPermutations("the");
现场测试用例:http : //jsfiddle.net/yahavbr/X79vz/1/
这只是基本实现,它不会删除重复项,也没有优化。但是,对于小字符串,您不会有任何问题,请像上面的测试用例一样添加时间度量,看看您的合理限制是多少。
假设要搜索一个大字符串,您可以使用正则表达式
检查首先匹配字母和字母总数的一组可能,
并返回使用与模式相同的字母集的匹配项。
//(不区分大小写)
function lettersets(str, pat){
var A= [], M, tem,
rx= RegExp('\\b(['+pat+']{'+pat.length+'})\\b', 'gi'),
pattern= pat.toLowerCase().split('').sort().join('');
while((M= rx.exec(str))!= null){
tem= M[1].toLowerCase().split('').sort();
if(tem.join('')=== pattern) A.push(M[1]);
};
return A;
}
字母集(s, 'the').sort();
这很相似,但会从一组单词中找到所有字谜/排列。我在一次采访中遇到了这个问题。给定一组单词 ['cat', 'dog', 'tac', 'god', 'act'],返回一个包含所有字谜组合在一起的数组。确保字谜是唯一的。
var arr = ['cat', 'dog', 'tac', 'god', 'act'];
var allAnagrams = function(arr) {
var anagrams = {};
arr.forEach(function(str) {
var recurse = function(ana, str) {
if (str === '')
anagrams[ana] = 1;
for (var i = 0; i < str.length; i++)
recurse(ana + str[i], str.slice(0, i) + str.slice(i + 1));
};
recurse('', str);
});
return Object.keys(anagrams);
}
console.log(allAnagrams(arr));
//["cat", "cta", "act", "atc", "tca", "tac", "dog", "dgo", "odg", "ogd", "gdo", "god"]