📌  相关文章
📜  使用链表查找给定字符串中的第一个非重复字符(1)

📅  最后修改于: 2023-12-03 15:06:59.642000             🧑  作者: Mango

使用链表查找给定字符串中的第一个非重复字符

在某些情况下,我们需要在一个字符串中查找第一个非重复的字符。使用链表可以方便地实现这个功能。本篇文章将介绍如何使用链表查找给定字符串中的第一个非重复字符。

链表实现

我们可以使用以下结构体来定义链表节点:

struct ListNode {
    char val;
    int count;
    ListNode *next;
    ListNode(char x) : val(x), count(1), next(NULL) {}
};

其中,val 为当前链表节点存储的字符,count 表示该字符在字符串中出现的次数,next 表示下一个链表节点的指针。

我们可以将每个字符插入链表中,如果链表中已经存在该字符,则将其 count 值加 1,否则将该字符作为新节点插入链表中。

代码实现如下:

ListNode* firstUniqChar(string s) {
    unordered_map<char, ListNode*> m;
    ListNode* dummy = new ListNode(-1);
    ListNode* tail = dummy;
    for (char c : s) {
        if (m.find(c) == m.end()) {
            tail->next = new ListNode(c);
            m[c] = tail->next;
            tail = tail->next;
        } else {
            m[c]->count++;
        }
    }
    ListNode* cur = dummy->next;
    while (cur) {
        if (cur->count == 1) {
            return cur;
        }
        cur = cur->next;
    }
    return NULL;
}

该函数返回第一个非重复字符的链表节点。如果字符串中不存在非重复字符,则返回 NULL

时间复杂度

时间复杂度为 $O(N)$,其中 $N$ 是字符串 s 的长度。我们需要遍历字符串一次,同时对于每个字符,使用 $O(1)$ 的时间将其插入或更新到哈希表和链表中。

总结

使用链表可以方便地查找字符串中的第一个非重复字符。我们可以使用一个哈希表来存储每个字符对应的链表节点,同时使用一个链表来按顺序存储字符串中出现过的所有字符。通过遍历链表来查找第一个 count 值为 1 的节点即可。