【题目】
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
【示例 1】
输入: S = “aab”
输出: “aba”
【示例 2】
输入: S = “aaab”
输出: “”
【注意】
S 只包含小写字母并且长度在[1, 500]区间内。
【代码】
【Python】
执行用时:
96 ms, 在所有 Python3 提交中击败了86.34%的用户
内存消耗:
16.4 MB, 在所有 Python3 提交中击败了77.99%的用户
class Solution:
def findLongestWord(self, s: str, dictionary: List[str]) -> str:
dictionary=[x for x in dictionary if len(x)<=len(s)]
dictionary.sort(key=lambda x:(-len(x),x))
print(dictionary)
for dic in dictionary:
last=-1
flag=1
for d in dic:
if s.find(d,last+1)!=-1:
last=s.find(d,last+1)
else:
flag=0
break
if flag:
return dic
return ""
【方法2】
执行用时:
64 ms, 在所有 Python3 提交中击败了99.53%的用户
内存消耗:
16.3 MB, 在所有 Python3 提交中击败了79.40%的用户
class Solution:
def findLongestWord(self, s: str, d: List[str]) -> str:
## 用好python内置函数sort()、find(),比双指针效率更高
## 可以用元组表示多关键字排序,第一关键字是长度降序,第二关键字是字符串本身字典序
d.sort(key = lambda x: (-len(x), x))
for word in d:
index = 0
for ch in word:
index = s.find(ch, index) + 1 # find输出-1:False
if not index:
break
else: # 这里用else语句保证break之后不会执行,正常循环结束会执行
return word
return ''