今天开始讲和大家坚持打卡面试非常重要算法练习---剑指offer,希望我们能一起肝。
1 题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
2 思路----java
求出所有可能出现在第一个未知的字符,即把第一个字符与后面所有字符交换
固定第一个字符,求后面所有字符的排列
3 代码实现
c++版本
class Solution {
public:
vector<string> Permutation(string str) {
if(str.empty())
return result;
chang(str, 0, str.size());
sort(result.begin(),result.end());
auto it = unique(result.begin(),result.end());
result.erase(it,result.end());
return result;
}
void chang(string &str,int start,int len){
if(start == len)
result.push_back(str);
//
for(int i = start; i swap(str[start],str[i]);
chang(str, start+1,len);
swap(str[start],str[i]);
}
}
vector<string> result;
};
java版本
import java.util.ArrayList;
public class Solution {
ArrayList list = new ArrayList<>();public ArrayList Permutation(String str) {
Permutation(str.toCharArray(),0);return list;
}public void Permutation(char[] c,int begin){if(begin==c.length-1)
{
list.add(new String(c));return;
}for(int i=begin;i if(c[begin]!=c[i]||begin==i) //判断是否有元素重复,重复就不交换位置
{char temp = c[i];for(int j=i;j>begin;j--) //要满足字典排序,所以挨个挪位置
c[j]=c[j-1];
c[begin]=temp;
Permutation(c,begin+1); //求后面所有字符的排列
temp= c[begin];for(int j=begin;j c[j]=c[j+1];
c[i]=temp;
}
}
}
}
python版本
# -*- coding:utf-8 -*-
class Solution:
def Permutation(self, ss):
# write code here
if len(ss)<=1:
return ss
result = set()
# 遍历字符串 固定第一个元素,每个元素都可以选择a,b,c然后递归
for i in range(len(ss)):
for j in self.Permutation(ss[:i]+ss[i+1:]):#依次固定元素,其他的全排列
result.add(ss[i]+j)#集合添加去重(如果存在重复字符,排列后存在相同如baa)
return sorted(result)
4 唠嗑
2020年8月4日打卡,打卡格式"打卡XX天"。暖蓝汇聚大家一起,探讨简历修改,面试经历分享,尽全力让大家能在2020找到理想的工作。如果你想加入,加我拉你进面试交流群。