本文最后更新于:2025年11月3日 下午
                  
                
              
            
            
              
                
                思路
这道题目前没有思路…先贴一道标程等什么时候理解了再补,如果有会推DP的大佬欢迎指点小海豚- -
C++代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
   | class Solution { public:     bool isScramble(string s1, string s2) {         int n = s1.size();         vector<vector<vector<bool>>> f(n, vector<vector<bool>>(n, vector<bool>(n+1)));         for(int k=1;k<=n;k++)         {             for(int i=0;i+k-1<n;i++)             {                 for(int j=0;j+k-1<n;j++)                 {                     if(k==1)                     {                         if(s1[i]==s2[j])    f[i][j][k]=true;                     }                     else                     {                         for(int u=1;u<k;u++)                         {                             if(f[i][j][u] && f[i+u][j+u][k-u] || f[i][j+k-u][u] && f[i+u][j][k-u])                             {                                 f[i][j][k]=true;                                 break;                             }                         }                     }                 }             }         }         return f[0][0][n];     } };
 
  | 
 
思路
本题要求是按照字典序给出全排列顺序,因此需要逐个字符的递归式判断,所以可以判定此题就是用DFS求解即可,当每次递归到边界时候说明一个方法已经走完了,这时候就可以结束当前递归,依次输出数字,然后继续下一个(注意状态恢复)即可,最终的边界部位直接退出程序即可
C++代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
   | #include<iostream>
  using namespace std;
  const int N=10;
  int n; int nums[N]; bool st[N];
  void dfs(int u) {     if(u>n)     {         for(int i=1;i<=n;i++)             cout<<nums[i]<<' ';         cout<<endl;         return;     }     for(int i=1;i<=n;i++)     {         if(!st[i])         {             nums[u]=i;             st[i]=true;             dfs(u+1);             st[i]=false;             nums[u]=0;         }     } }
  int main() {     cin>>n;     dfs(1);     return 0; }
 
  |