title: 【每日一题】LeetCode 87.扰乱字符串
tags:

  • leetcode
  • acwing
  • 每日一题
  • 算法
    abbrlink: c4df32de
    date: 2021-04-16 11:44:09

LeetCode 87.扰乱字符串

思路

这道题目前没有思路…先贴一道标程等什么时候理解了再补,如果有会推DP的大佬欢迎指点小海豚- -

C++代码

  1. class Solution {
  2. public:
  3. bool isScramble(string s1, string s2) {
  4. int n = s1.size();
  5. vector<vector<vector<bool>>> f(n, vector<vector<bool>>(n, vector<bool>(n+1)));
  6. for(int k=1;k<=n;k++)
  7. {
  8. for(int i=0;i+k-1<n;i++)
  9. {
  10. for(int j=0;j+k-1<n;j++)
  11. {
  12. if(k==1)
  13. {
  14. if(s1[i]==s2[j]) f[i][j][k]=true;
  15. }
  16. else
  17. {
  18. for(int u=1;u<k;u++)
  19. {
  20. if(f[i][j][u] && f[i+u][j+u][k-u] || f[i][j+k-u][u] && f[i+u][j][k-u])
  21. {
  22. f[i][j][k]=true;
  23. break;
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }
  30. return f[0][0][n];
  31. }
  32. };

AcWing 94.递归实现排列型枚举

思路

本题要求是按照字典序给出全排列顺序,因此需要逐个字符的递归式判断,所以可以判定此题就是用DFS求解即可,当每次递归到边界时候说明一个方法已经走完了,这时候就可以结束当前递归,依次输出数字,然后继续下一个(注意状态恢复)即可,最终的边界部位直接退出程序即可

C++代码

  1. #include<iostream>
  2. using namespace std;
  3. const int N=10;
  4. int n;
  5. int nums[N];
  6. bool st[N];
  7. void dfs(int u)
  8. {
  9. if(u>n)
  10. {
  11. for(int i=1;i<=n;i++)
  12. cout<<nums[i]<<' ';
  13. cout<<endl;
  14. return;
  15. }
  16. for(int i=1;i<=n;i++)
  17. {
  18. if(!st[i])
  19. {
  20. nums[u]=i;
  21. st[i]=true;
  22. dfs(u+1);
  23. st[i]=false;
  24. nums[u]=0;
  25. }
  26. }
  27. }
  28. int main()
  29. {
  30. cin>>n;
  31. dfs(1);
  32. return 0;
  33. }