2018/11/7
🍞环境:牛客的编译环境
🍰语言:JavaScript
☕️难点:
开始并不懂全排的基本思路是什么,后来明白思路后,因为这个字符串包括重复数字,所以后面的难点在于使用string的replace方法交换时,会导致少情况,因为replace是值交换,并不是Index交换。
交换那里因为是字符串,没有办法直接交换位置,如果考虑将字符串变成数组后交换之后再变成字符串,这个操作会导致程序超时。所以最后我的解决办法是使用slice方法来进行字符串拼接。这个方法比较简单,而且不会超时。
🍊题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
🍎思路:交换的规则是把字符串的第一个数字和后面的数字依次交换,每次交换得到的字符串要去结果数组里查重,如果存在则不会压入临时栈中,如果不存在则压入临时栈中。临时栈的作用是保存新出现的字符串,再每次交换完之后,将临时栈中的字符串弹出,再按照交换规则交换。如此即可。停止的条件是临时栈为空。
🍇代码:
function Permutation(str)
{
// write code here
if(str.length == 0)
return [];
var result = [],
stack = [];
result.push(str);
stack.push(str);
while(stack.length != 0){
var newStr = stack.pop();
for(var i = 1; i < newStr.length; i++){
//字符串拼接
var tmp = newStr[i] + newStr.slice(1,i) + newStr[0] + newStr.slice(i + 1,newStr.length);
if(result.indexOf(tmp) == -1){
result.push(tmp);
stack.push(tmp);
}
}
}
return result.sort(function(a,b){
if(a > b)
return 1;
else if(a == b)
return 0;
else
return -1;
});
}