TLE? 有可以加速的空間嗎? 請高手指點
#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
vector<string> V;
char A[50];
char T[50];
bool v[50];
int len;
//----------------------------------------------
bool compare(string a, string b){
int k=a.length();
for(int i=0; i<k; i++){
char aa=tolower(a[i]);
char bb=tolower(b[i]);
if(aa<bb) return true;
else if(aa>bb) return false;
else if(aa==bb && a[i]>b[i]) return false;
else if(aa==bb && a[i]<b[i]) return true;
}
return true;
}
//----------------------------------------------
void DFS(int k){
if(k>=len){
V.push_back(T);
return;
}
for(int i=0; i<len; i++){ //遞迴
if(v[i]==0){
v[i]=1;
T[k]=A[i];
DFS(k+1);
T[k]=' ';
v[i]=0;
}
}
}
//==============================================
int main(){
int u;
cin>>u;
while(u--){
while(scanf("%s",A)!=-1){
len=strlen(A);
memset(v,0,sizeof(v));
V.clear();
int k=0;
DFS(k);
sort(V.begin(), V.end(), compare);
for(int i=0; i<V.size(); i++){
if(V[i] != V[i+1]) cout<<V[i]<<endl;
}
}
}
return 0;
}
原文全部吃掉
這一題不需要把DFS產生全部的結果存起來做排序檢查有沒有和前一個一樣
題目希望你的作法應該是一邊展開DFS時,
除了比對這個字元有沒有用過之外, 你需要存上一次迴圈時使用的字元拿來跟這一輪字元比對, 需要不一樣才能進到下一次遞迴
題目和這一題做法雷同:d436: 10098 - Generating Fast, Sorted Permutation
讓你多一個練習的機會