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;
}
}

浙公网安备 33010602011771号