Redian新闻
>
问一下OJ的Anagrams那道题
avatar
问一下OJ的Anagrams那道题# JobHunting - 待字闺中
s*x
1
Time Limit Exceeded了
但感觉已经cache了intermediate result了
是不是这题assume只是26个小写英文字母呢,如果是的话,用array就更快?
贴一下code
class AnagramString {
boolean visited;
String str;
private Map map = null;

AnagramString(String s) {
this.str = s;
}

boolean isAnagram(String s) {
if (this.map == null) {
this.map = new HashMap(this.str.length());
for (int i = 0; i < this.str.length(); i++) {
char c = this.str.charAt(i);
map.put(c, map.containsKey(c) ? map.get(c) + 1 : 1);
}
}
Map m = new HashMap(this.map
);
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
Integer n = m.get(c);
if (n == null || n == 0) {
return false;
}
m.put(c, n-1);
}
return true;
}
}
public class Solution {
public ArrayList anagrams(String[] strs) {
Map> map = new HashMapArrayList>();
ArrayList result = new ArrayList();
for (String str : strs) {
ArrayList l = map.get(str.length());
if (l == null) {
l = new ArrayList();
l.add(new AnagramString(str));
map.put(str.length(), l);
} else {
boolean anagramExists = false;
for (AnagramString s : l) {
if (s.isAnagram(str)) {
anagramExists = true;
result.add(str);
if (!s.visited) {
s.visited = true;
result.add(s.str);
}
break;
}
}
if (!anagramExists) {
l.add(new AnagramString(str));
}
}
}

return result;
}
}
avatar
l*a
2
please use
Map> to store ansgrams then you will get it
you can use sorted characters string as the key for each word

【在 s********x 的大作中提到】
: Time Limit Exceeded了
: 但感觉已经cache了intermediate result了
: 是不是这题assume只是26个小写英文字母呢,如果是的话,用array就更快?
: 贴一下code
: class AnagramString {
: boolean visited;
: String str;
: private Map map = null;
:
: AnagramString(String s) {

avatar
l*a
3
你这个isAnagram函数对吗?
str=“aabc” S=“abc”时候什么情况?

【在 s********x 的大作中提到】
: Time Limit Exceeded了
: 但感觉已经cache了intermediate result了
: 是不是这题assume只是26个小写英文字母呢,如果是的话,用array就更快?
: 贴一下code
: class AnagramString {
: boolean visited;
: String str;
: private Map map = null;
:
: AnagramString(String s) {

avatar
s*x
4
谢谢!
这个思路本来也有想到,感觉space开销很多。现在细想一下,确实不用inner loop的
linear search,应该会快很多。
已经过了OJ
class AnagramString {
boolean visited;
String str;

AnagramString(String s) {
this.str = s;
}

static String getKey(String s) {
char[] a = s.toCharArray();
Arrays.sort(a);
return new String(a);
}
}
public class Solution {
public ArrayList anagrams(String[] strs) {
Map> map = new HashMap, HashMap>();
ArrayList result = new ArrayList();
for (String str : strs) {
HashMap m = map.get(str.length());
String key = AnagramString.getKey(str);
if (m == null) {
m = new HashMap();
m.put(key, new AnagramString(str));
map.put(str.length(), m);
} else {
AnagramString as = m.get(key);
if (as != null) {
result.add(str);
if (!as.visited) {
as.visited = true;
result.add(as.str);
}
} else {
m.put(key, new AnagramString(str));
}
}
}

return result;
}
}

【在 l*****a 的大作中提到】
: please use
: Map> to store ansgrams then you will get it
: you can use sorted characters string as the key for each word

avatar
s*x
5
这个应该只会在相同length的string的bucket里才会invoke这个function

【在 l*****a 的大作中提到】
: 你这个isAnagram函数对吗?
: str=“aabc” S=“abc”时候什么情况?

avatar
l*a
6
你这个辅助类有什么好处?

【在 s********x 的大作中提到】
: 谢谢!
: 这个思路本来也有想到,感觉space开销很多。现在细想一下,确实不用inner loop的
: linear search,应该会快很多。
: 已经过了OJ
: class AnagramString {
: boolean visited;
: String str;
:
: AnagramString(String s) {
: this.str = s;

avatar
s*x
7
主要用一个visited做mark,这样我的map不需要ArrayList,只要存第一个visited
string。应该内存会少用点。
而且因为result不在乎order,我不需要最后遍历这个map去collect所有的string

【在 l*****a 的大作中提到】
: 你这个辅助类有什么好处?
avatar
T*e
8
lz很下工夫啊,一个简单的anagram涉及到了这么多东西,态度值得学习。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。