package com.interview.books.leetcodeoj; import com.interview.utils.ConsoleWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * Created_By: stefanie * Date: 15-2-8 * Time: 下午7:37 */ public class LOJ187_RepeatedDNASequence { //use Integer to present char sequence, 00 for A, 01 for C, 10 for G, 11 for T, need 20 bit. (Integer) //scan string, generate new key by ((prev << 2) & 0x000FFFFF) + map.get(current); //count using HashMap static HashMap<Character, Integer> map = new HashMap(); static { map.put('A', 0); map.put('C', 1); map.put('G', 2); map.put('T', 3); } public List<String> findRepeatedDnaSequences(String s) { List<String> repeated = new ArrayList(); if(s == null || s.length() <= 10) return repeated; HashMap<Integer, Integer> sequences = new HashMap(); Integer key = 0; for(int i = 0; i < s.length(); i++){ key = getKey(key, s.charAt(i)); if(i < 9) continue; int count = sequences.containsKey(key)? sequences.get(key) : 0; if(count == 1) repeated.add(s.substring(i - 9, i + 1)); sequences.put(key, count + 1); } return repeated; } public Integer getKey(Integer prev, char current){ return ((prev << 2) & 0x000FFFFF) + map.get(current); } public static void main(String[] args){ LOJ187_RepeatedDNASequence finder = new LOJ187_RepeatedDNASequence(); List<String> repeated = finder.findRepeatedDnaSequences("CCGGCCGGCCGGCC"); ConsoleWriter.printCollection(repeated); } }