不使用哈希表重新写这段代码
时间: 2024-10-16 14:21:10 浏览: 11
python算法数据结构课程视频含代码之哈希表2G
如果你不想使用哈希表来存储字符串的子串,可以考虑采用滑动窗口的方法,同时维护一个倒置的辅助数组来检查反转后的子串。下面是不使用哈希表的 C 语言代码示例:
```c
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define MAX_LEN 101
bool reverse_match(const char* s, int len) {
// 判断给定字符串与其反转是否为子串
for (int i = 0, j = len - 1; i < len / 2; i++, j--) {
if (s[i] != s[j]) return false;
}
return true;
}
int longest_common_subsequence(const char* str1, int len1, const char* str2, int len2) {
int dp[len1 + 1][len2 + 1];
// 动态规划填充dp数组
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (str1[i - 1] == str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = std::max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
// 返回最长公共子序列长度,同时检查反转匹配情况
int max_len = dp[len1][len2];
int start = 0;
for (int l = 0; l <= max_len; l++) {
for (int i = max_len - l; i >= 0; i--) {
for (int j = 0; j <= l; j++) {
if (dp[i][j] == l && reverse_match(str1 + i, l)) {
start = i;
return l;
}
}
}
}
return -1; // 若无满足条件的最长字符串,则返回-1
}
int main() {
int t, n;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
char str1[MAX_LEN], str2[MAX_LEN];
while (n--) {
scanf("%s", str1);
int len1 = strlen(str1);
longest_common_subsequence(str1, len1, str1, len1); // 只需要对原字符串求最长子串即可
}
}
return 0;
}
```
在这个版本中,我们不再保存所有字符串的子串,而是只关注原字符串。通过动态规划计算最长公共子序列的长度,并在遍历过程中检查原始字符串和其反转是否匹配。这种方法虽然更复杂一些,但对于特定的问题,它也能达到同样的效果。
阅读全文