今天做的都是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
> groupStrings(String[] strings) { List
> res = new ArrayList
>(); Map > map = new HashMap >(); for(int i = 0; i < strings.length;i++) { if(map.containsKey(strings[i].length())) { map.get(strings[i].length()).add(strings[i]); } else { List tempList = new ArrayList<>(); tempList.add(strings[i]); map.put(strings[i].length(),new ArrayList<>(tempList)); } } for(Integer k: map.keySet()) { List list = map.get(k); while(list.size()!=0) { String a = list.get(0); list.remove(0); List 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 (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
> groupStrings(String[] strings) { List
> res = new ArrayList
>(); if (strings.length == 0) return res; Map > map = new HashMap >(); 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 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; }}