考点:回溯、字符串、全排列、递归
知识点
1.string
string类提供了一系列针对字符串的操作,比如:
- 1.size()和length()--返回string对象的字符个数,他们执行效果相同
- 2.push_back() --尾插一个字符
- 3.insert()-- 插入字符,insert(pos,char):在制定的位置pos前插入字符char
- 4.append()--拼接字符串,在字符串的末尾添加字符
- 5.sort(s.begin(),s.end())-- string的排序
- 6.find() -- 在字符串中查找字符串
- 7.replace() -- 替换字符串 ,string &replace(int p, int n,const char *s); //删除从p开始的n个字符,然后在p处插入串s
- 8.substr() -- 返回某个子字符串,string substr(int pos = 0,int n = npos) const; //返回pos开始的n个字符组成的字符串
- 9.string &erase(int p, int n);//删除p开始的n个字符,返回修改后的字符串
- 10.void swap(string &s2); //交换当前字符串与s2的值
参考链接https://blog.csdn.net/qq_37941471/article/details/82107077
2.vector函数
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
分析思路
将字符串分两部分。第一部分是它的第一个字符,第二部分是后面所有字符。
第一步求所有可能出现在第一个位置的字符,即把第一个字符和后面所有字符交换。如图(a)将字符串分两部分,(b)拿第一个字符和他后面字符逐个交换。
第二步,固定第一个字符,求后面所有字符全排列(仍然将后面字符分两部分,排列求法同第一步)。此处实现应用递归,应用回溯算法思想。
实现代码
class Solution {
public:
vector<string> result;
vector<string> Permutation(string str) {
if(str.length()==0)
return result;
Permutation1(str,0);
sort(result.begin(),result.end());
return result;
}
void Permutation1(string str,int begin){
//递归结束的条件:索引到达最后一个元素
if(begin==str.length()-1)
{
result.push_back(str);
return;
}
for(int i=begin;i<str.length();i++){
//如果字符串相同,则不交换
if(i!=begin && str[i]==str[begin]){
continue;
}
// 第一次循环i与begin相等,相当于第一个位置自身交换,关键在于之后的循环,
// 之后i!= begin,则会交换两个不同位置上的字符,直到begin==str.size()-1,进行输出
swap(str[i],str[begin]); //后面依次与第一个begin交换
Permutation1(str,begin+1); //递归调用,前面begin+1的位置不变,后面字符依次全排列
swap(str[i],str[begin]);
}
}
};