c - 寻找字谜
问题描述
if (strlen(a) != strlen(b)) {
printf("Not anagram");
} else {
for (int i = 0; i < strlen(a); i++) {
for (int j = 0; j < strlen(b); j++) {
if (a[i] == b[j]) {
len++;
}
}
}
if (len != strlen(a))
printf("Not anagram");
else
printf("Anagram");
}
return 0;
这是一个代码片段,用于检查 2 个字符串是否是字谜。这里如何处理重复字符?另外,这个程序可以更优化吗?这段代码的运行时复杂度是多少?
解决方案
最佳解决方案可能是基于计算每个字符串中的字符数,然后比较两个计数。理想情况下,我们应该使用Dictionary数据结构,但为简单起见,我将在数组上演示该算法:
char *word1 = "word1";
char *word2 = "ordw1";
// C strings can have only 256 possible characters, therefore let's store counts in an array with 256 items.
int* letterCounts1 = calloc(256, sizeof(int));
int* letterCounts2 = calloc(256, sizeof(int));
size_t length1 = strlen(word1);
size_t length2 = strlen(word2);
for (size_t i = 0; i < length1; i++) {
int letterIndex = word1[i] & 0xFF;
letterCounts1[letterIndex] += 1;
}
for (size_t i = 0; i < length2; i++) {
int letterIndex = word2[i] & 0xFF;
letterCounts2[letterIndex] += 1;
}
bool isAnagram = true;
for (size_t i = 0; i < 256; i++) {
if (letterCounts1[i] != letterCounts2[i]) {
isAnagram = false;
break;
}
}
free(letterCounts1);
free(letterCounts2);
if (isAnagram) {
printf("Anagram");
} else {
printf("Not anagram");
}
该算法具有线性 ( O(n)
) 复杂性(对“字典”的迭代可以被认为是一个常数)。
您的原始解决方案具有二次复杂性,但是,您还必须确保将结果存储strlen
到变量中,因为每次调用strlen
都必须遍历整个字符串,从而将复杂性增加到三次。
推荐阅读
- terraform - 关于在 Terraform 中将“darwin_64”转换为“linux_64”
- angular - 根据“新 chrome 政策”,我们无法在没有用户交互的情况下播放音频
- javascript - 有什么方法可以在 react-native-webview 中禁用 hapticFeedback
- angular - 发布请求后地图功能无法正常工作
- hyperledger-fabric - 无法使用 softhsm 配置启动 fabric-ca-server
- jenkins-pipeline - 如何在邮件中设置部署和中止按钮
- angular - 动态生成的嵌套 FormGroup。需要帮助才能使其正常工作
- jenkins - 如何向 jenkins build 中发生更改的用户发送电子邮件
- audio - 当我将无声音频 (mp3) 附加到现有音频列表时,最终音频会出现乱码?
- python-3.x - 尝试应用 pd.to_datetime(df) 时出现错误“无法组装日期时间:'int' 对象不可切片”