力扣单词规律c语言的代码思路
时间: 2024-12-01 10:08:00 浏览: 19
力扣(LeetCode)上有一些关于字符串或字符处理的问题,涉及到单词规律的题目通常会考察对字符串操作、哈希(如字典树或AC自动机)以及模式匹配的理解。例如,解决"给定两个单词 word1 和 word2,计算并返回 word1 到 word2 需要改变多少个字母才能变成 word2"这类问题的一般思路:
1. **遍历字符串**:首先,比较两个单词的每个对应位置的字符。如果字符不同,计数器加一。
2. **特殊规则处理**:某些题目可能会考虑大小写敏感或不敏感的情况,需要根据题目要求判断是否需要转换字符。
3. **跳过连续相同的子串**:为了更高效地计算,可以忽略那些相邻字符都相同的连续子串,因为它们都不需要改变。
4. **哈希数据结构**:为了快速查找,可以使用哈希表存储每个字符最后一次出现的位置,这在统计过程中可以减少不必要的比较次数。
5. **优化算法**:对于复杂度较高的问题,可能还需要注意空间复杂度,比如采用滚动数组或者只保存当前状态和前一步的状态。
```c
int minDistance(char* word1, char* word2) {
int m = strlen(word1), n = strlen(word2);
if (m > n) {
// 交换word1和word2
char temp[30];
strcpy(temp, word1);
strcpy(word1, word2);
strcpy(word2, temp);
m = n;
}
int dp[m + 1][n + 1];
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= m; i++) {
dp[i][0] = i - 1;
}
for (int j = 1; j <= n; j++) {
dp[0][j] = j - 1;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (word1[i - 1] == word2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = 1 + min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1]));
}
}
}
return dp[m][n];
}
```
阅读全文