设s和t是表示成单链表的两个串,试编写一个找出s中第1个不在t中出现的字符(假设每一个结点只存放一个字符)的的算法。
时间: 2023-05-31 09:18:38 浏览: 340
### 回答1:
算法思路:
1. 遍历s串,对于每个字符,都在t串中查找是否存在。
2. 如果不存在,则说明该字符是s中第一个不在t中出现的字符,直接返回该字符即可。
3. 如果遍历完s串都没有找到不在t中出现的字符,则返回空。
算法实现:
```
char findFirstCharNotInT(ListNode* s, ListNode* t) {
unordered_set<char> charSet;
while (t != nullptr) {
charSet.insert(t->val);
t = t->next;
}
while (s != nullptr) {
if (charSet.find(s->val) == charSet.end()) {
return s->val;
}
s = s->next;
}
return '\0';
}
```
算法分析:
时间复杂度:O(m+n),其中m和n分别为s和t的长度。
空间复杂度:O(n),其中n为t的长度,用一个哈希表存储t中的字符。
### 回答2:
这道题目是一道关于链表操作的算法题,我们可以通过两个指针来完成查找。算法思路如下:
1.先遍历链表t,将其中出现过的字符标记一下。这可以使用一个大小为256的数组来实现,数组下标为字符的ASCII码,数组值为1表示该字符出现过。
2.遍历链表s,对于每个字符,查看是否已经在t中出现过。这可以使用第一步中的数组进行查询,如果该字符的值为0,则说明该字符是s中的第1个不在t中出现的字符,输出该字符并结束程序。
3.如果在遍历完链表s之前未能找到目标字符,则说明s中所有的字符都出现过,输出提示信息并结束程序。
代码实现如下:
```
char find_first_not_in_t(List* s, List* t) {
int char_set[256] = { 0 };
Node* t_ptr = t->head;
while (t_ptr != NULL) {
char_set[t_ptr->data] = 1;
t_ptr = t_ptr->next;
}
Node* s_ptr = s->head;
while (s_ptr != NULL) {
if (char_set[s_ptr->data] == 0) {
return s_ptr->data;
}
s_ptr = s_ptr->next;
}
printf("所有字符都在t中出现过");
exit(1);
}
```
### 回答3:
我们可以使用哈希表来解决这个问题。具体步骤如下:
1. 将串t中的所有字符都存入哈希表中,其中哈希表的key为字符,value为该字符在串t中出现的次数。
2. 从串s的头结点开始遍历,逐个检查每个节点中存储的字符是否出现在哈希表中。
3. 若该节点中的字符不在哈希表中,说明该字符是s中第一个不在t中出现的字符,直接返回该字符即可。
4. 若遍历到链表结尾,仍未找到该字符,则返回空字符,表示串s中所有字符都在串t中出现过。
时间复杂度分析:整个算法需要遍历两个链表,时间复杂度为O(n),其中n为链表长度。由于哈希表的插入和查找操作时间复杂度均为O(1),所以不会增加总体时间复杂度。因此,本算法的时间复杂度为O(n)。
阅读全文