题目描述:
你将得到一个字符串数组 A
。
如果经过任意次数的移动,S == T,那么两个字符串 S
和 T
是特殊等价的。
一次移动包括选择两个索引 i
和 j
,且 i % 2 == j % 2
,并且交换 S[j]
和 S [i]
。
现在规定,A
中的特殊等价字符串组是 A
的非空子集 S
,这样不在 S
中的任何字符串与 S
中的任何字符串都不是特殊等价的。
返回 A
中特殊等价字符串组的数量。
示例1:
输入:["a","b","c","a","c","c"]
输出:3
解释:3组["a","a"],["b"],["c","c","c"]
示例2:
输入:["aa","bb","ab","ba"]
输出:4
解释:4组["aa"],["bb"],["ab"],["ba"]
示例3:
输入:["abc","acb","bac","bca","cab","cba"]
输出:3
解释:3组["abc","cba"],["acb","bca"],["bac","cab"]
示例4:
输入:["abcd","cdab","adcb","cbad"]
输出:1
解释:1组["abcd","cdab","adcb","cbad"]
提示:
1 <= A.length <= 1000
1 <= A[i].length <= 20
- 所有
A[i]
都具有相同的长度。 - 所有
A[i]
都只由小写字母组成。
方法一:
class Solution(object):
def numSpecialEquivGroups(self, A):
"""
:type A: List[str]
:rtype: int
"""
#思路:遍历列表A,边遍历边做以下处理:将每一个位置上所对应的字符串的奇数位和偶数位分开从小到大保存到一个列表当中;
#最终,找到不同搭配的个数作为该函数的返回值
if len(A) == 0 or len(A) == 1:
return len(A)
new_list = []
for i in range(len(A)):
odd_list = []
even_list = []
for j in range(len(A[i])):
if j%2 == 0:
odd_list.append(A[i][j])
else:
even_list.append(A[i][j])
odd_list = list(sorted(odd_list))
even_list = list(sorted(even_list))
new_list.append([odd_list,even_list])
res = 1
for i in range(1,len(new_list)):
if new_list[i] not in new_list[:i]:
res = res + 1
return res
方法二:
class Solution(object):
def numSpecialEquivGroups(self, A):
"""
:type A: List[str]
:rtype: int
"""
#思路:遍历A列表中的每一个位置,对每个位置对应的字符串进行以下处理:将奇数位字符取出并排序、将偶数位字符取出并排序,将两者的结果重新拼接为字符串
#若其在res中没有出现过,则将其append到其内,最终计算res的长度即为最终结果
res = []
for item in A:
tmp = ''.join(sorted(item[::2])+sorted(item[1::2]))
if tmp not in res:
res.append(tmp)
return len(res)
菜鸟一枚,代码仅供参考,如有问题,望指正~