2016-04-15 84 views
0

我的代碼接受一個字符串,並試圖檢查是否存在一個輸入字符串的排列或不存在。如果存在一個這樣的字符串,打印它否則打印「沒有答案」。但我的代碼doesn' t編譯並顯示錯誤。 錯誤是::沒有匹配函數調用'next_permutation(std :: string &)'| 完成此任務的正確方法是什麼?next_permutation in C++ on strings

#include <bits/stdc++.h> 
using namespace std; 
int main(){ 
    int t; 
    cin>>t; 
    while(t--){ 
     string s; 
     cin>>s; 
     string ans=next_permutation(s);// do permutation and store it in string ans 
     if(ans==s)// if there is no permutation possible original and ans will be same 
      cout<<"no answer "<<endl; 
     else 
      cout<<ans<<endl;// else print ans 
    } 
} 
+2

你讀過錯誤消息了嗎?我建議您在發佈到stackoverflow之前作爲您的第一步。 – user2079303

+0

@ user2079303調用'next_permutation(std :: string&)'時沒有匹配函數| –

+0

將相關信息也放入問題中,而不只是在評論中。 – user2079303

回答

0

下面是功能next_permutation的原型,其中的調用語句string ans=next_permutation(s);不符合其中任何一個。

template <class BidirectionalIterator> 
    bool next_permutation (BidirectionalIterator first, 
         BidirectionalIterator last); 

template <class BidirectionalIterator, class Compare> 
    bool next_permutation (BidirectionalIterator first, 
         BidirectionalIterator last, Compare comp); 

更改您這樣的代碼來檢查天氣置換退出或不

if(next_permutation(s.begin(),s.end())) 
    cout<<s<<endl; 
else 
    cout<<"no answer "<<endl; 

,如果你要打印的s所有排列,然後做這個

while(next_permutation(s.begin(),s.end())) 
{ 
    cout<<s<<endl; 
} 

這是儘管你可能不得不改變邏輯來完成任務

+0

那麼這樣做的正確方法是什麼? –

+0

@satya查看更新後的代碼 –

0

編譯錯誤是很清楚的:

no matching function for call to 'next_permutation(std::string&)'| 

編譯器告訴你,不存在功能next_permutation(std::string&)。如果你看看documentation,你會發現的確如此。有兩種過載:

template< class BidirIt > 
bool next_permutation(BidirIt first, BidirIt last); 

template< class BidirIt, class Compare > 
bool next_permutation(BidirIt first, BidirIt last, Compare comp); 

它們都不符合您的呼叫。

使用std::string::beginstd::string::end將迭代器獲取到字符串內的字符範圍。

0

這是要做到這一點

 // thanks to rajeev's code 
     #include <bits/stdc++.h> 
     using namespace std; 
     int main(){ 
     int t; 
     cin>>t; 
     while(t--){ 
      string s; 
      cin>>s; 
      bool ans=next_permutation(s.begin(),s.end()); 
      if(!ans) 
      cout<<"no answer "<<endl; 
      else 
      cout<<s<<endl; 

      } 
     } 
+0

@RajeevSingh yes –

0

此代碼也是正確的方法解決了這個問題:

#include <bits/stdc++.h> 
using namespace std; 
int main(){ 
    int t; 
    cin>>t; 
    while(t--){ 
     string s; 
     cin>>s; 
     string original_s=s; // store the input string in a variable as original_s 
     next_permutation(s.begin(),s.end());// do permutation and s will be changed if permutation occurs 
     if(s==original_s)// if there is no permutation possible original and s will be same 
      cout<<"no answer "<<endl; 
     else 
      cout<<s<<endl;// else print ans 
    } 
}