依然。。毫无思路。。理解了题意,但是想不到怎么解决。。orz,每次一点开别人的代码,为什么别人都能想到,而且写出那么精简的代码呢。。。
这道题用到了set这个容器,集合的特点就是不会有重复的元素,所以只要统计集合的size就可以知道有多少个不同的了。那每次放入集合中的都是我先把偶数位和奇数位的字符以及个数统计一下,作为一个字符串存入集合,我觉得这种思路蛮好的,因为它既考虑了字符的种类也考虑了字符的个数,要想实现这样的功能, 一是可以开辟一个很大的数组, 以下标作为索引,二是排序。
还有一个思路是就地把偶数位和奇数位分别排序,存入集合。
总而言之都是把奇数位和偶数位用到的字符和个数作为一条标识,以此来判断。
这是跑的比较慢的
class Solution {
public int numSpecialEquivGroups(String[] A) {
Set<String> set = new HashSet();
for( String s : A ){
int[] m1 = new int[256];
int[] m2 = new int[256];
for( int i = 0 ; i < s.length() ; i ++ ){
if( i % 2 == 0 )m1[ s.charAt( i ) ] ++ ;
else m2[ s.charAt( i ) ] ++ ;
}
set.add( Arrays.toString( m1 ) + Arrays.toString( m2 ));
}
return set.size();
}
}
看了一下别人提交的跑了8ms的
class Solution {
Set<String> set = new HashSet();
public int numSpecialEquivGroups(String[] A) {
int n = A.length;
for( String s : A ){
int l = s.length();
char[] first = new char[ l - l / 2 ];
char[] second = new char[ l / 2 ];
for( int i = 0 ; i < l ; i ++ ){
if( i % 2 == 0 )first[ i / 2 ] = s.charAt( i );
else second[ i / 2 ] = s.charAt( i );
}
Arrays.sort( first );
Arrays.sort( second );
String tmp = new String( first ) + new String( second );
set.add( tmp );
}
return set.size();
}
}
好像 new String( first ) 比Arrays.toString( first)更快