LeetCode-187. 重复的DNA序列-Java-medium

LeetCode - 解题笔记 - 187 - Repeated DNA Sequences 因为题目限制了长度为10,涉及到四种位态,因此可以一个2位表示共20位的子串来保存当前状态,一个int整型数就能解决问题,能够优化扫描时间(滑窗)的同时也能节省存储(整型数的哈希)从初始位置不断向后寻找一个指定长度的子串,并用哈希表进行计数。满足要求时保存结果(注意避免重复判定的问题)。我想了几个能够简化子串存取的方法(滑窗),但是都不能实际优化复杂度。【官方题解参考】官方题解基于位操作给出了一个滑窗优化方案。由于题目的限制非常直观,因此解法也非常直观。Solution2的Python实现... 阅读详情

题目链接

法一(哈希)
    /**
     * 法一(哈希)
     *
     * @param s
     * @return
     */
    public List<String> findRepeatedDnaSequences(String s) {
        List<String> ans = new LinkedList<>();
        Set<String> set = new HashSet<>();
        for (int i = 0; i <= s.length() - 10; i++) {
            String sub = s.substring(i, i + 10);
            if (set.contains(sub) && !ans.contains(sub)) { // 遇到过sub并且它还未加入到ans
                ans.add(sub);
            } else {
                set.add(sub);
            }
        }
        return ans;
    }
法二(哈希 + 滑动窗口 + 位运算)
    /**
     * 静态变量
     */
    final static int L = 10; // 滑动窗口长度
    static Map<Character, Integer> fx = new HashMap<>(); // 字母与对应二进制的映射

    /**
     * 静态代码块
     */
    static {
        fx.put('A', 0); // A对应二进制00
        fx.put('C', 1); // C对应二进制01
        fx.put('G', 2); // G对应二进制10
        fx.put('T', 3); // T对应二进制11
    }

    /**
     * 法二(哈希 + 滑动窗口 + 位运算)
     * 1. 改进
     *    字符串进行哈希查找的时间复杂度是O(n),而字符/整数是O(1),故考虑将字符串转化为整数
     * 2. 思路
     *   (1)字符A、C、G、T分别用数字1、2、3、4表示,对应的二进制分别为00、01、10、11
     *   (2)这样字符串ACGT就可以表示为00011011,对应的数字是27
     *   (3)由于滑动窗口长度为10,故可以将滑动窗口范围内的字符串表示为整型数字(整型数字有32位)
     * 3. 细节
     *   (1)字符串新增一个字符
     *        x = x << 2 | fx.get(s.charAt(i));
     *   (2)二进制数保留20位
     *       x = x & (( 1 << 20 ) - 1);
     *
     * @param s
     * @return
     */
    public List<String> findRepeatedDnaSequences_2(String s) {
        int n = s.length(), x = 0;
        List<String> ans = new LinkedList<>();
        Map<Integer, Integer> cnt = new HashMap<>();
        if (n <= L) { // s的长度小于滑动窗口长度
            return ans;
        }
        for (int i = 0; i < L - 1; i++) {  // 求解初始时滑动窗口范围内字母组成的数字x
            x = x << 2 | fx.get(s.charAt(i));
        }
        for (int i = 0; i <= n - L; i++) { // 窗口每次向右滑动一个单位,总共滑动 n - L + 1 次
            x = (x << 2 | fx.get(s.charAt(i + L - 1))) & (1 << L * 2) - 1; // 计算当前位置滑动窗口范围内字母组成的数字x
            cnt.put(x, cnt.getOrDefault(x, 0) + 1); // 统计x出现的次数
            if (cnt.get(x) == 2) { // 如果x出现2次,则将x对应的字符串加入ans
                ans.add(s.substring(i, i + L));
            }
        }
        return ans;
    }
本地测试
        /**
         * 187. 重复的DNA序列
         */
        lay.showTitle(187);
        Solution187 sol187 = new Solution187();
        String s187 = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT";
        System.out.println(s187);
        List<String> ans187_1 = sol187.findRepeatedDnaSequences(s187);
        System.out.println(ans187_1.toString());
        List<String> ans187_2 = sol187.findRepeatedDnaSequences_2(s187);
        System.out.println(ans187_2.toString());
杰理AC695N/AC696N/AC701N系列芯片在线调音教程 本教程详细介绍AC695N/AC696N/AC701N芯片在线音效调试方法,包括工具准备(需安装杰理包管理器)、程序修改(需关闭USB功能并启用在线调试宏)、连接方式(USB或串口)、音效调节步骤(EQ和混响参数调整)以及配置保存。注意事项包括版本匹配、连接检查和供电稳定等,并提供常见问题解决方案。适用于快速配置实时音效调试环境并保存最终配置。 阅读详情

相关推荐

Arduino、ESP32驱动AS3935数字闪电传感器(闪电传感器)

闪电传感器采用AMS独具创新的AS3935数字闪电传感芯片与Coilcraft的MA5532-AE专用天线,可在室内或室外,安全地检测方圆40km范围内发生闪电的距离,闪电相对强度与统计闪电发生次数。

不脱发的程序猿 1952

LeetCode——187. 重复DNA序列(Repeated DNA Sequences)[中等]——分析及代码(C++)

LeetCode——187. 重复DNA序列[Repeated DNA Sequences][中等]——分析及代码[C++]一、题目二、分析及代码1. 位运算 + 滑动窗口 + 哈希表(1)思路(2)代码(3)结果三、其他 一、题目 所有 DNA 都由一系列缩写为 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。 编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次

江南土豆的博客 803

群晖transmission_broadwell-6.1_2.94-16跳过校验版本

【免积分下载请至主页有百度云链接】2.94-16版本的Transmission源码编译,加入跳过校验选项,在页面选择种子后右键选择“Ask tracker for more peers”,中文页面为“获取更多peer(雷达图标)”即可跳过文件哈希检测直接100%完成。Broadwell架构,群晖6.1-6.2版本可用,适用以下型号:FS3400FS2017RS1619xs+RS3618xsRS18017xs+RS4017xs+RS3617xs+DS3617xs

Leetcode 187:重复DNA序列(超详细解决方案!!!)

所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。 编写一个函数来查找 DNA 分子中所有出现超多一次的10个字母长的序列(子串)。 示例: 输入: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出: ["AAAAACCCCC", "CCCCCAA...

coordinate的博客 3462

LeetCode187. 重复DNA序列

出现次数大于等于2次,因此我们可以直接使用hash结构记录每个子串出现的次数,边记录边统计答案即可。

时光、疏离了记忆づ童话的博客 607

leetcode 187

的字符串变量,并将其初始化为二进制字符串 “00000000000001101111”。A 使用 "00"表示,C使用"01"表示,G使用"10"表示,T使用"11"表示,int 是32bit, 字符串是20bit所以可以用int表示字符串的序列,函数返回的是字符串中字符的数量,而不是字符串占用的字节数。类型使用 UTF-8 编码存储字符串,每个字符可能占用不同数量的字节。类型还提供了其他用于获取字符串信息的成员函数,如。类型的值,表示字符串中字符的数量。成员函数来获取字符串的长度。

weixin_43876597的博客 267

LeetCode187. Repeated DNA Sequences 重复DNA序列Medium)(JAVA

LeetCode187. Repeated DNA Sequences 重复DNA序列Medium)(JAVA) 题目地址: https://leetcode.com/problems/repeated-dna-sequences/ 题目描述: All DNA is composed of a series of nucleotides abbreviated as ‘A’, ‘C’, ‘G’, and ‘T’, for example: “ACGAATTCCG”. When studying DN

qq_16927853的博客 215

[滑动窗口]leetcode187重复DNA序列(medium)

题目: 题解: 滑动窗口 我们需要用hashmap存放<10个字符的字符串,该字符串的数量>。滑动窗口:下标i从0开始,每次取10个字符作为窗口字符串,判断窗口的字符串是否出现2次然后确定是否添加到res,注意这里只需要判断2次,因为这样可以避免重复添加相同的字符串。 i+9<size表示从i起包括i有10个字符,最终取不到10个字符结束循环。 代码如下: class ...

algsup 523

[Leetcode 187, medium] Repeated DNA Sequences

Repeated DNA Sequences

算法的实践 542

[leetcode]187. Repeated DNA Sequences

/* * @lc app=leetcode id=187 lang=java * * [187] Repeated DNA Sequences * * https://leetcode.com/problems/repeated-dna-sequences/description/ * * algorithms * Medium (36.72%) * Likes: 489 ...

Belle_Chou的博客 214

leetCode练习(187

题目:Repeated DNA Sequences 难度:MEDIUM 问题描述: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to ident

大德如危的博客 624

LeetCode187. 重复DNA序列————中等

题目 187. 重复DNA序列 所有 DNA 都由一系列缩写为 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。 编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。 示例 1: 输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出:["AAAAACCCCC","CCCCCAAAAA"] 示例 2: 输入:s = "

Kinght_123的博客 4717

(字符串)leetcode187. 重复DNA序列

给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不止一次的 长度为 10 的序列(子字符串)。4)遍历方式:使用迭代器map::iterator it = mp.begin();遍历字符串,用map容器记录所有子序列的个数,遍历map容器,子序列个数大于1的子序列即为重复序列DNA序列 由一系列核苷酸组成,缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。3)插入数据的方式:用数组的方式插入mp[s] = 1;2)初始值:map的value初始值为0。

qq_44842918的博客 459

leetcode 187. 重复DNA序列

子字符串然后用哈希表记录,>1就是重复的,集合去重最后加入列表

邹九的个人博客 609

[LeetCode]187. 重复DNA序列java实现)暴力 + 哈希

[LeetCode]187.java实现)1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路(): 3. 解法 ---------------------------------------------------解法--------------------------------------------------- 可能存在的问题: 4. 可能有帮助的前置习题 5. 所用到

cloud的博客 421

LeetCode解法汇总187. 重复DNA序列

返回所有在 DNA 分子中出现不止一次的。时,识别 DNA 中的重复序列非常有用。的序列(子字符串)。由一系列核苷酸组成,缩写为。使用HashMap的特性即可。

分享+记录 564

LeetCode187. 重复DNA序列

这题题目描述的有点不清楚,题意是给一个字符串,如果有某个子串(长度为10)重复出现了,就记录到一个数组里,最后返回的数组就是重复出现的子串组成的数组。 因为子串长度固定为10,所以遍历一遍就行,每个子串都记录到一个set里,这个set就是判断子串是否重复出现了,如果重复出现了,就记录到数组里。 但是由于子串可能不止出现两次,为了防止在数组里加入多次子串,额外再用一个unordered_map记录这个子串是否已经加入到结果数组中,如果加入到了结果数组中,则record[这个子串]不为0(record是这个u.

RJ_theMag的博客 238

LeetCode187场周赛 题解

文章目录a.旅行终点站a.题目a.分析a.参考代码b.是否所有 1 都至少相隔 k 个元素b.题目b.分析b.参考代码c.绝对差不超过限制的最长连续子数组c.题目c.分析c.参考代码d.有序矩阵中的第 k 个最小数组和d.题目d.分析d.暴力d.基于最小堆的bfsd.参考代码d.暴力代码d.优先队列bfs代码 a.旅行终点站 a.题目 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表...

夢裡夢到醒不來的夢 752

LeetCode187-重复DNA序列

LeetCode187-重复DNA序列

abc123mma的博客 465
上一篇: LeetCode-179. 最大数-Java-medium
下一篇: LeetCode-199. 二叉树的右视图-Java-medium
happy life 2022
博客等级 码龄8年 42粉丝 365原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值