249. Group Shifted Strings

今天做的都是E难度的。。懒得写。

这道感觉不是E难度。。

判断是否能SHIFT是使用

if(a.charAt(i) - a.charAt(i-1) == b.charAt(i) - b.charAt(i-1)||(int)Math.abs((a.charAt(i) - a.charAt(i-1)) - (b.charAt(i) - b.charAt(i-1))) == 26 )

俩字母之间相差是一样的,或者+了26,因为Z的下一个是A。

然后好像其实也没什么别的值得说的,总结下就是,按长度先分类,然后同样长度的要再按SHIFT分类。

这题怎么都不像E难度的。。

public class Solution {
    public List<List<String>> groupStrings(String[] strings) 
    {
        List<List<String>> res = new ArrayList<List<String>>();
        
        Map<Integer,List<String>> map = new HashMap<Integer,List<String>>();
        
        for(int i = 0; i < strings.length;i++)
        {
            if(map.containsKey(strings[i].length()))
            {
                map.get(strings[i].length()).add(strings[i]);
            }
            else
            {
                List<String> tempList = new ArrayList<>();
                tempList.add(strings[i]);
                map.put(strings[i].length(),new ArrayList<>(tempList));
            }
        }
        
        for(Integer k: map.keySet())
        {
            List<String> list = map.get(k);
            while(list.size()!=0)
            {
                String a = list.get(0);
                list.remove(0);
                List<String> addingList = new ArrayList<>();
                addingList.add(a);
                for(int i = 0; i < list.size();)
                {
                    if(shiftable(a,list.get(i)))
                    {
                        addingList.add(list.remove(i));
                    }
                    else i++;
                }
                res.add(new ArrayList<String>(addingList));
            }
            
        }
        
        
        return res;
    }
    
    public boolean shiftable(String a, String b)
    {
        int m  = 0, n= 0;
        
        for(int i = 1; i < a.length();i++)
        {
            if(a.charAt(i) - a.charAt(i-1) == b.charAt(i) - b.charAt(i-1)  ||   
               (int)Math.abs((a.charAt(i) - a.charAt(i-1)) - (b.charAt(i) - b.charAt(i-1))) == 26 ) continue;
            else return false;
        }
        
        return true;
        
        
    }
}

二刷。

这个题居然是E难度的? 感觉很麻烦。

一刷是先按照String的长度分类,分类之后再看能不能shift进行二次归类。

二刷换了方法,比如BCD XYZ都是由ABC得到的,我们不放把每个string的第一个字母变成A,剩下的字母根据第一个字母的SHIFT程度相应SHIFT。
BCD,第一个字母从B到A,变了1,那么C和D也变1,就是BC,最后是ABC。
同理XYZ。

然后根据第一个字母为A来分来,简单多了。

复杂度:
电面复杂度吃屎了一次之后,才发现自己复杂度计算很差,得抓紧。。
Time O(n * k) Space O(n * k)
不是很确定,N个Sring,K是String的长度。

public class Solution {
    public List<List<String>> groupStrings(String[] strings) {
        List<List<String>> res = new ArrayList<List<String>>();
        if (strings.length == 0) return res;
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        for (int i = 0; i < strings.length; i++) {
            String tempStr = shiftStr(strings[i]);
            if (map.containsKey(tempStr)) {
                map.get(tempStr).add(strings[i]);
            } else {
                List<String> tempList = new ArrayList<>();
                tempList.add(strings[i]);
                map.put(tempStr, tempList);
            }
        }
        for (String s: map.keySet()) {
            res.add(map.get(s));
        }
        return res;
    }
    
    public String shiftStr(String s) {
        String res = "";
        if (s.length() == 0) return res;
        int diff = s.charAt(0) - 'a';
        res += 'a';
        for (int i = 1; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c - diff < 'a') res += (char)(c - diff + 26);
            else res += (char)(c - diff);
        }
        
        return res;
    }

}
posted @ 2016-11-04 07:54  哇呀呀..生气啦~  阅读(115)  评论(0)    收藏  举报