给定两个字符串 order 和 s 。order 的所有单词都是 唯一 的,并且以前按照一些自定义的顺序排序。
对 s 的字符进行置换,使其与排序的 order 相匹配。更具体地说,如果在 order 中的字符 x 出现字符 y 之前,那么在排列后的字符串中, x 也应该出现在 y 之前。
返回 满足这个性质的 s 的任意排列 。
示例 1:
输入: order = “cba”, s = “abcd”
输出: “cbad”
解释:
“a”、“b”、“c”是按顺序出现的,所以“a”、“b”、“c”的顺序应该是“c”、“b”、“a”。
因为“d”不是按顺序出现的,所以它可以在返回的字符串中的任何位置。“dcba”、“cdba”、“cbda”也是有效的输出。
示例 2:
输入: order = “cbafg”, s = “abcd”
输出: “cbad”
提示:
我的想法:
这题这么简单,这我不秒过?
1.最开始想的是,搞一个 returnstr 用来返回值。
遍历 order,当遍历到的字符在字符串 s 中,returnstr 就加上这个字符;
再遍历 s ,当遍历到的字符不在 returnstr 中,returnstr 就加上这个字符。
返回 returnstr 。
class Solution:
def customSortString(self, order: str, s: str) -> str:
returnstr = str()
for o in order:
if o in s:
returnstr += o
for c in s:
if c not in returnstr:
returnstr += c
return returnstr
结果 :
解答错误 3 / 39 个通过的测试用例
输入 order = “kqep” s = “pekeq”
输出 “kqep” 预期结果 “kqeep”
2.然后发现没考虑到重复字符的问题。改一下套路:新搞一个 slist = list(s)。
还是遍历 order,当遍历到的字符在字符串 s 中,returnstr 就加上这个字符。之前用的是 if,这回用的是 while ,并且将 slist 中这个字符减去,为了避免重复字符没在returnstr 中返回。
再遍历 slist ,当遍历到的字符不在 returnstr 中,returnstr 就加上这个字符。
返回 returnstr 。
class Solution:
def customSortString(self, order: str, s: str) -> str:
returnstr = str()
slist = list(s)
for o in order:
while o in slist:
returnstr += o
slist.remove(o)
for c in slist:
if c not in returnstr:
returnstr += c
return returnstr
结果
解答错误 9 / 39 个通过的测试用例
输入 order = “hucw”
s = “utzoampdgkalexslxoqfkdjoczajxtuhqyxvlfatmptqdsochtdzgypsfkgqwbgqbcamdqnqztaqhqanirikahtmalzqjjxtqfnh”
输出 “hhhhhuucccwtzoampdgklexsqfjyvbnir”
预期结果 “hhhhhuucccwaaaaaaaaabbdddddeffffggggiijjjjkkkkllllmmmmnnnoooopppqqqqqqqqqqqrsssttttttttvxxxxxyyzzzzz”
3.这个输出咋差了这老些。又想了下,在遍历完 order 之后 slist 剩下的就都是没在returnstr 里的值了,直接合并加在 returnstr 里就好了。
class Solution:
def customSortString(self, order: str, s: str) -> str:
returnstr = str()
slist = list(s)
for o in order:
while o in slist:
returnstr += o
slist.remove(o)
returnstr += "".join(slist)
return returnstr
这回过了
粘一下其他人的题解:
官方题解 - 自定义排序 / 计数排序
【宫水三叶】简单构造题