要马内的AC

许诺  •  3个月前


检测到你没有马内 我不会给你AC的


评论:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

bool isScramble(string s, string t) {

int n = s.size();
if (n != t.size()) return false;
if (s == t) return true;

// 检查字符频率是否相同
int count[26] = {0};
for (int i = 0; i < n; i++) {
    count[s[i] - 'a']++;
    count[t[i] - 'a']--;
}
for (int i = 0; i < 26; i++) {
    if (count[i] != 0) return false;
}

// 初始化动态规划数组
vector<vector<vector<bool>>> dp(n, vector<vector<bool>>(n, vector<bool>(n + 1, false)));

// 填充长度为1的情况
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        dp[i][j][1] = (s[i] == t[j]);
    }
}

// 处理长度从2到n的情况
for (int len = 2; len <= n; len++) {
    for (int i = 0; i <= n - len; i++) { // s的起始位置i
        for (int j = 0; j <= n - len; j++) { // t的起始位置j
            // 遍历所有可能的分割点k
            for (int k = 1; k < len; k++) {
                // 情况一:不交换,检查左左和右右是否匹配
                if (dp[i][j][k] && dp[i + k][j + k][len - k]) {
                    dp[i][j][len] = true;
                    break;
                }
                // 情况二:交换,检查左右和右左是否匹配
                if (dp[i][j + (len - k)][k] && dp[i + k][j][len - k]) {
                    dp[i][j][len] = true;
                    break;
                }
            }
        }
    }
}

return dp[0][0][n];

}

int main() {

string s, t;
cin >> s >> t;
cout << (isScramble(s, t) ? "true" : "false");
return 0;

} 咳咳咳,还是给吧


许诺  •  3个月前

请先登录,才能进行评论