输入包括两行,第一行一个字符串,代表str1,第二行一个字符串,代表str2。
如果str2是str1的旋变字符串请输出“YES”,否则输出“NO”。
abcd dbac
YES
abcd->d...abc->d...ab...c->d...b...a...c
IJz JzI
YES
左边为l右边为Jz交换 变Jzl
时间复杂度,额外空间复杂度。
#include <stdio.h> #include <stdbool.h> #include <string.h> #define MAXLEN 101 bool is_valid(char *str1, char *str2) { int char_map[256]; memset(char_map, 0, sizeof(int) * 256); for (int i = 0; i < strlen(str1); i++) { char_map[str1[i]]++; } for (int i = 0; i < strlen(str2); i++) { if (--char_map[str2[i]] < 0) { return false; } } return true; } bool dp[MAXLEN][MAXLEN][MAXLEN]; int main(void) { char str1[MAXLEN], str2[MAXLEN]; scanf("%s%s", str1, str2); if (!is_valid(str1, str2)) { printf("%s\n", "NO"); return 0; } int len1 = (int) strlen(str1); int len2 = (int) strlen(str2); for (int i = 0; i < len1; i++) { for (int j = 0; j < len2; j++) { dp[i][j][1] = str1[i] == str2[j]; } } for (int s = 2; s <= len1; s++) { for (int i = 0; i < len1; i++) { for (int j = 0; j < len2; j++) { for (int ls = 1; ls < s; ls++) { if ((dp[i][j][ls] && dp[i + ls][j + ls][s - ls]) || (dp[i][j + s - ls][ls] && dp[i + ls][j][s - ls])) { dp[i][j][s] = true; break; } } } } } printf("%s\n", dp[0][0][len1] ? "YES" : "NO"); return 0; }