C++:列出字符串的排列
C++: Listing the permutations of a string
我想问问我所有的程序员同事,只关于效率。我目前正在解决在求职面试中可能提出的问题,并且我遇到了著名的字符串排列。我在下面编写的代码可能是编程历史上最常见的代码,但是,我不知道它的状态,因为我没有检查任何解决方案。
长话短说,我在下面编写的程序会是一个合适的解决方案吗?或者可以提高效率。问,因为如果我有一天遇到,我想确保我已经为这个问题实施了最佳方法之一。
#include <iostream>
using namespace std;
int fac(int num)
{
int result=1;
for(int i=1;i<=num;i++)
result*=i;
return result;
}
int main(int argc, const char * argv[])
{
string str="abcd";
int limit=fac(str.size());
int mod=str.size();
for(int i=0;i<limit;i++){
swap(str[i%mod],str[(i+1)%mod]);
cout<<str<<endl;
}
return 0;
}
不处理字符串中的重复字母,例如 "aaabbb"
.
你可以使用递归:
#include <iostream>
#include <tchar.h>
#include <string>
using namespace std;
void swap(char &first, char &second) {
char tmp = first;
first = second;
second = tmp;
}
void enumPermutations(string &p, int m)
{
if (m == p.size() - 1)
cout << p << endl;
else
for (int j = m; j < p.size(); j++) {
swap(p[j], p[m]);
enumPermutations(p, m+1);
swap(p[j], p[m]);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string str = "abcd";
enumPermutations(str, 0);
getchar();
return 0;
}
(在Visual Studio中编译和测试)。
我已经通过使用std::map
找到了解决方案。不要认为它效率低下;
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int fac(int num)
{
int result=1;
for(int i=1;i<=num;i++)
result*=i;
return result;
}
int main(int argc, const char * argv[])
{
string str="aabb";
int limit=fac(str.size());
int mod=str.size();
std::map<string,bool>T;
vector<string>permutations;
for(int i=0;i<limit;i++){
if(T[str]==0){
permutations.push_back(str);
T[str]=1;
}
swap(str[i%mod],str[(i+1)%mod]);
}
for(int i=0;i<permutations.size();i++)
cout<<permutations[i]<<endl;
return 0;
}
您的问题的答案是否定的。在知道任何建议的解决方案有效之前,您不必担心它的效率。 而这个不起作用。
下面说明这一事实。
ben-tillys-macbook-pro:ton btilly$ cat foo.cc
#include <iostream>
using namespace std;
int fac(int num)
{
int result=1;
for(int i=1;i<=num;i++)
result*=i;
return result;
}
int main(int argc, const char * argv[])
{
string str="abcd";
int limit=fac(str.size());
int mod=str.size();
for(int i=0;i<limit;i++){
swap(str[i%mod],str[(i+1)%mod]);
cout<<str<<endl;
}
return 0;
}
ben-tillys-macbook-pro:ton btilly$ g++ foo.cc
ben-tillys-macbook-pro:ton btilly$ ./a.out | wc
24 24 120
ben-tillys-macbook-pro:ton btilly$ ./a.out | sort -u | wc
12 12 60
ben-tillys-macbook-pro:ton btilly$ ./a.out | grep bdc
ben-tillys-macbook-pro:ton btilly$
相关文章:
- 找到具有最多子串栅栏的字符串排列
- 为什么我得到长度仅为 3 的字符串排列的输出?
- 如何排列二进制字符串以最小化它们之间的距离
- C++按字母顺序排列的字符串数组
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 如何在 c++ 中按字母顺序排列数组中的字符串?
- 在c++中生成字符串的排列
- 从给定字符串中查找长度 k 的所有排列/组合
- C++ 字符串的排列,输出的结果小于或等于字符串的长度
- 生成具有条件的给定字符串的排列
- 从左到右打印字符串的组合(不是排列)c++
- 如何找到通过仅移动相邻字符创建的字符串的排列?-C++
- 如何在C++中分隔和排列名字和全名字符串
- 如何从长度为 n 的字符串中获取 lengh k 的所有唯一排列的数量
- 它如何排列单词以使用 qsort 和字符串
- 如何按大小写顺序排列字符串(而不是按字典顺序排列)
- 如何用数字排列字符串
- 按字母顺序排列字符串数组(甚至是*ptr)
- 使用swap按字母顺序排列字符串数组
- 为什么 std::sort 不按字母顺序排列字符串数组?