• 【字符串】重复的DNA序列


    题目描述

    DNA序列由一系列核苷酸组成,缩写为'A','C','G'和'T'。

    例如,"ACGAATTCCG"是一个 DNA序列 。
    在研究 DNA 时,识别 DNA 中的重复序列非常有用。

    给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不止一次的长度为10的序列(子字符串)。你可以按 任意顺序 返回答案。

    示例 1:

    输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
    输出:["AAAAACCCCC","CCCCCAAAAA"]

    解题思路

    这是一道字符串处理题,由于使用java语言,字符处理直接使用内置函数。

    基本思路:

    • 使用map,对每次出现的字符串进行计数;
    • 如果字符串出现次数大于2则直接加入到结果集中。

    代码实现如下:

    1. import java.util.ArrayList;
    2. import java.util.HashMap;
    3. import java.util.List;
    4. import java.util.Map;
    5. class Solution1 {
    6. public List findRepeatedDnaSequences(String s) {
    7. Map map = new HashMap<>();
    8. for (int i = 0; i <= s.length() - 10; i++) {
    9. String v = s.substring(i, i + 10);
    10. int count = map.getOrDefault(v, 0);
    11. map.put(v, ++count);
    12. }
    13. List res = new ArrayList<>(map.size());
    14. for (Map.Entry entry : map.entrySet()) {
    15. if (entry.getValue() > 1) {
    16. res.add(entry.getKey());
    17. }
    18. }
    19. return res;
    20. }
    21. public static void main(String[] args) {
    22. Solution1 solution = new Solution1();
    23. System.out.println(solution.findRepeatedDnaSequences("AAAAAAAAAAAAA"));
    24. }
    25. }

    性能调优-方案1

    这里直接使用2个HashSet优化,思路如下(set用于记录出现次数、res用于结果去重):

    • 如果set.add(subString)为true,则不加入到res中,否则就加入到res中。
    1. import java.util.*;
    2. class Solution {
    3. public List findRepeatedDnaSequences(String s) {
    4. if (s.length() <= 10) {
    5. return new ArrayList<>();
    6. }
    7. Set set = new HashSet<>(s.length() - 10);
    8. Set res = new HashSet<>();
    9. for (int i = 0; i <= s.length() - 10; i++) {
    10. String subString = s.substring(i, i + 10);
    11. if (!set.add(subString)) {
    12. res.add(subString);
    13. }
    14. }
    15. return new ArrayList<>(res);
    16. }
    17. public static void main(String[] args) {
    18. Solution solution = new Solution();
    19. System.out.println(solution.findRepeatedDnaSequences("AAAAAAAAAAAAA"));
    20. System.out.println(solution.findRepeatedDnaSequences("AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"));
    21. }
    22. }

    性能调优-方案2

    这块参考了其他人的解法,核心思路就是把字符串比较切换成数字比较:

    1. 对字符做映射 A->0, C->1, G->2, T->3; 这里记录为map;
    2. 定义int x = 0;  x =( (x<<2) | map(s.charAt(i)) ),将x左移2位,再和map(s.charAt(i))做按位或运算;
    3. 遍历字符串s,x = ( (x<<2) | map(s.charAt(i)) )  & ((1<<20)-1),这里使用((1<<20)-1) 按位与之后,确保只有20位。

    按照上述思路代码实现:

    1. import java.util.ArrayList;
    2. import java.util.HashMap;
    3. import java.util.List;
    4. import java.util.Map;
    5. class Solution3 {
    6. // 10个字符
    7. int N = 10;
    8. // 20位
    9. int FF = ((1 << 20) - 1);
    10. public List findRepeatedDnaSequences(String s) {
    11. if (s.length() <= N) {
    12. return new ArrayList<>();
    13. }
    14. Map map = new HashMap<>();
    15. map.put('A', 0);
    16. map.put('C', 1);
    17. map.put('G', 2);
    18. map.put('T', 3);
    19. int x = 0;
    20. for (int i = 0; i < N; i++) {
    21. x = ((x << 2) | map.get(s.charAt(i)));
    22. }
    23. Map countMap = new HashMap<>();
    24. countMap.put(x, 1);
    25. List res = new ArrayList<>();
    26. for (int i = N; i < s.length(); i++) {
    27. x = FF & ((x << 2) | map.get(s.charAt(i)));
    28. int count = countMap.getOrDefault(x, 0);
    29. count++;
    30. if (count == 2) {
    31. // 坑点
    32. res.add(s.substring(i - N + 1, i + 1));
    33. }
    34. countMap.put(x, count);
    35. }
    36. return res;
    37. }
    38. public static void main(String[] args) {
    39. Solution3 solution = new Solution3();
    40. System.out.println(solution.findRepeatedDnaSequences("AAAAAAAAAAAAA"));
    41. System.out.println(solution.findRepeatedDnaSequences("AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"));
    42. }
    43. }

    总结

    这道题核心还是做优化,有点像孔乙己说茴香豆的茴有多少种写法;这里我提供了3种,如果有更高效、更简洁的代码欢迎回复。

  • 相关阅读:
    羽毛球馆的绿色之选——气膜体育馆
    查看Android应用方法耗时
    前端——Vuex状态管理
    勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?
    基于javaweb仓库管理系统简易课程报告-软件工程
    make: /bin/nvcc: Command not found 解决找不到nvcc
    【深度学习】高速神经网络(Highway Network)
    作业 增删改查 三个功能
    C语言学习(十)之枚举和typedef
    打破原则引入SQL,MongoDB到底想要干啥???
  • 原文地址:https://blog.csdn.net/weiliuhong1/article/details/126551416