找出字符串第一个只出现一次的字符,需要时间复杂度和空间复杂度都为N,C语言解法
时间: 2024-09-28 13:13:18 浏览: 38
在C语言中,找出一个字符串中第一个只出现一次的字符并保持时间复杂度和空间复杂度都是O(N),可以使用哈希表(也叫散列表或字典)的数据结构来实现。这是因为哈希表可以在常数时间内完成查找操作。
以下是步骤和C语言代码实现:
1. 首先,创建一个大小为256(因为ASCII字符集有256个字符)的布尔数组`hash`,所有元素初始化为0,代表每个字符未出现过。
2. 遍历输入的字符串,对于每一个字符,更新哈希表`hash`,将对应位置的值设为1表示该字符出现过。
3. 再次遍历字符串,同时检查当前字符对应的`hash`数组值。如果发现某个字符的`hash`值还是0,说明它是第一个只出现一次的字符,记录下来并结束遍历。
4. 返回找到的第一个只出现一次的字符(如果存在的话)。
由于两次遍历字符串各一次,所以时间复杂度是O(N);而哈希表的空间使用固定,所以空间复杂度也是O(N)。
```c
#include <stdio.h>
#include <stdbool.h>
int main() {
char str[100];
int i;
// 获取字符串输入
printf("Enter a string: ");
fgets(str, sizeof(str), stdin);
str[strlen(str) - 1] = '\0'; // remove newline character
bool hash[256] = {false}; // 初始化哈希表
for (i = 0; str[i]; i++) {
if (!hash[str[i]]) {
hash[str[i]] = true; // 更新字符出现状态
} else {
hash[str[i]] = false; // 如果出现过,则置假
}
}
for (i = 0; str[i]; i++) {
if (hash[str[i]] == false) {
printf("First unique character: %c\n", str[i]);
break;
}
}
return 0;
}
```
阅读全文