187. 重复的DNA序列
一、题目
给定一个表示 DNA序列 的字符串 s
,返回所有在 DNA 分子中出现不止一次的 长度为 10
的序列(子字符串)。你可以按 任意顺序 返回答案。
二、思路
如此一来,一个长为 10 的字符串就可以用 20 个比特表示,而一个 int 整数有 32 个比特,足够容纳该字符串,因此我们可以将 s 的每个长为 10 的子串用一个 int 整数表示(只用低 20 位)。
三、代码
class Solution { const int L = 10; unordered_map<char, int> bin = {{'A', 0}, {'C', 1}, {'G', 2}, {'T', 3}}; public: vector<string> findRepeatedDnaSequences(string s) { vector<string> ans; int n = s.length(); if (n <= L) { return ans; } int x = 0; for (int i = 0; i < L - 1; ++i) { x = (x << 2) | bin[s[i]]; } unordered_map<int, int> cnt; for (int i = 0; i <= n - L; ++i) { x = ((x << 2) | bin[s[i + L - 1]]) & ((1 << (L * 2)) - 1); if (++cnt[x] == 2) { ans.push_back(s.substr(i, L)); } } return ans; } };
四、分析
复杂度分析
时间复杂度:O(N),其中 N 是字符串 s 的长度。
空间复杂度:O(N)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了