说明
来自HackerRank网站的一个编程练习题。
题目
- 描述
字符串的大小根据字典序进行比较。
给定一个字符串,将其中部分字符交换位置得到一个新字符串。
定义“下一个最大字符串”:新字符串比原字符串大,并且是所有符合要求的字符串中最小的那一个。
例如:
给定一个字符串“defg”,则下一个最大字符串为“degf”。 - 要求
计算给定字符串的下一个最大字符串。如果不存在,返回“no answer”。 - 格式
输入格式
第一行为字符串数量,代表测试用例个数。
接下来每一行代表一个测试用例。
输出格式
输出每行对应的最大字符串,如果不存在符合要求的字符串,返回“no answer”。
代码
def bigger_greater(s_str):
# 将字符串转换为列表,每个字符为一个元素
s_str = list(s_str)
length = len(s_str) - 1
# 如果字符串为字符逆序排序的,已为最大字符串,所以返回no answer
if s_str == sorted(s_str, reverse=True):
return "no answer"
else:
# 从最后一个字符开始,比较该字符与前一个字符的大小,找到比前一个字符大的字符,记录位置
first = length
while first > 0:
if s_str[first] > s_str[first - 1]:
break
else:
first -= 1
# 再次从最后一个字符开始,,比较该字符与first-1位置字符的大小,找到比该字符大的字符,记录位置
second = length
while s_str[second] <= s_str[first - 1]:
second -= 1
# 交换两次找到的位置的字符
s_str[first - 1], s_str[second] = s_str[second], s_str[first - 1]
# 交换之后,将第一次找到的字符位置开始到字符串结尾位置的子字符串替换为排序后的字符串。
s_str[first:] = sorted(s_str[first:])
return "".join(s_str)
if __name__ == '__main__':
nums = int(input())
result = list()
for _ in range(nums):
src_string = input()
result.append(bigger_greater(src_string))
for ele in result:
print(ele)