我想问一下我所有的程序员只有效率。我目前正在解决在求职面试中可能会遇到的问题,而且我遇到了字符串的着名排列。我在下面编写的代码可能是编程历史中最常见的代码,但是,由于我还没有检查过任何解决方案,因此我不知道它的状态。
很长一段时间,我在下面编写的程序是否合适?或者它可以变得更有效率。问,因为如果有一天我遇到了,我想确保我已经实现了解决这个问题的最佳方法之一。
#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;
}
答案 0 :(得分:1)
不处理字符串中的重复字母,例如"aaabbb"
。
答案 1 :(得分:1)
你可以使用递归:
#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中编译和测试)。
答案 2 :(得分:0)
我使用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;
}
答案 3 :(得分: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$