本文主要是介绍输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
class Solution {
private: string temp;
private: vector<string> result;
public: vector<string> Permutation(string str) { vector<string> result; //创建字符串数组 int len = str.length(); //求出字符串长度,作为参数传递控制循环次数 if(!len) return result; //当输入为空时,直接返回 BubbleSort(str,0,len-1); Permutations(result, str, 0, len); return result; }
void Permutations(vector<string>&result, string str,int index, int len){ //当索引指向字符串尾部时,将str压入数组 if (index == len){//index==len,说明首位置已经是末尾了,这时的递归输入已经只有一个元素了 result.push_back(str); return result; } for (int i = index; i < len; ++i) { if (i!=index && str[i]== str[index]) continue;// 保证当输入多个重复字符时,不会重复计算 swap(str[i],str[index]);//每一次,交换第i个位置和首位置的元素 Permutations(result, str, index+1, len); } }
void BubbleSort(string &arr,int left,int high){ int i,j;for(i=left;i<high;i++){for(j=i+1;j<high;j++){if(arr[i]>arr[j]){swap(arr[i],arr[j]);}}}
}
};
思路:首先将字符串进行排序,然后将字符串分为两部分,第一个字符和后边N-1个字符。然后从第2个字符开始轮番和第一个字符交换
swap(str[i],str[index]);//每一次,交换第i个位置和首位置的元素
解决此问题两步比较关键:(1):字典排序:解决这个问题要求在写排列之前先把字符串进行排序使用选择排序
void BubbleSort(string &arr,int left,int high){ int i,j;for(i=left;i<high;i++){for(j=i+1;j<high;j++){if(arr[i]>arr[j]){swap(arr[i],arr[j]);}}}
}
(2)重复字母:此问题可以在进行交换时直接跳过
if (i!=index && str[i]== str[index]) continue;// 保证当输入多个重复字符时,不会重复计算
这篇关于输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!