1093 字符串A+B (20 分)
题意描述:
给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。
输入格式:
输入在两行中分别给出 A 和 B,均为长度不超过 10^6 的、由可见 ASCII 字符 (即码值为32~126)和空格组成的、由回车标识结束的非空字符串。
输出格式:
在一行中输出题面要求的 A 和 B 的和。
输入样例:
This is a sample test
to show you_How it works
输出样例:
This ampletowyu_Hrk
解题思路:
Mara: 这题好做呀,就去重,不不不,直接打个标记,然后就按题意来就行了。
Jack: 题目里面最大的输入可是10^6长度的字符串啊。用Python 怕是会超时。
Mara: 先试试呗。
def main():
string1 = input()
string2 = input()
flags = [0 for x in range(32, 127)]
answer = []
for x in string1:
if flags[ord(x) - 32] == 0:
answer.extend([x])
flags[ord(x) - 32] = 1
for x in string2:
if flags[ord(x) - 32] == 0:
answer.extend([x])
flags[ord(x) - 32] = 1
print(''.join(answer))
if __name__ == '__main__':
main()
最后两个测试点全超时了。o(╥﹏╥)o
Jack: 莫慌莫慌,我有办法!“即码值为32~126”,也就是说答案字符串的长度是有限的,最多才是把所有的字符都算一遍。这也才126 - 32 + 1 == 95 个。中间可以直接判断是不是所有字符都已经出现了,如果是,后面的字符就没有必要再处理了,因为肯定是不会出现的。像这样:
def main():
string1 = input()
string2 = input()
flags = [0 for x in range(32, 127)]
answer = []
for x in string1:
if flags[ord(x) - 32] == 0:
answer.extend([x])
flags[ord(x) - 32] = 1
if sum(flags) == 126 - 32 + 1:
break
for x in string2:
if flags[ord(x) - 32] == 0:
answer.extend([x])
flags[ord(x) - 32] = 1
if sum(flags) == 126 - 32 + 1:
break
print(''.join(answer))
if __name__ == '__main__':
main()
还有一个测试点超时了,最后一个点。∑(っ°Д°;)っ。
Mara: 让我看看,(o゚▽゚)o 打标记的部分可以用字典啊,这样也不用ord( )
了,这样能快一点,而且把 126 - 32 + 1
的值算出来吧。Python 没有编译的过程,也不知道会不会自动优化这个计算。快去试试。
Jack: 过了!!(づ ̄3 ̄)づ╭❤~
代码:
def main():
string1 = input()
# 接收字符串A
string2 = input()
# 接收字符串B
flags = {}
# 一个字典,用来记录已经出现了的字符
answer = []
# answer 用来记录最终将要输出的字符们
for string in (string1, string2):
# 依次考虑字符串A 和 B
for x in string:
# 对A串或B串中的每个字符
if x not in flags:
# 若该字符尚未出现过,让这个字符上场吧。
answer.extend([x])
# 为什么要用extend呢? extend快呀。为什么是[x] 而不是 x 呢?
# 因为extend() 只接收列表呀。
flags[x] = None
# 这个字符出现了,打上标记。打标记的操作可能会重复哦。
if len(flags) == 95:
# 嘿嘿嘿,如果所有的字符都出现了,那后面的字符们就没机会再上场
# 了。这也太惨了。
# 95 == 126 - 32 + 1
break
print(''.join(answer))
# 输出答案喽。
if __name__ == '__main__':
main()
易错点:
- 用Python 处理字符串很方便,就是容易超时。超时怎么办?继续优化呗。怎么优化 ? 把执行效率低的方法换成执行效率高的方法,把执行效率低的数据结构换成执行效率高的数据结构。然后,减少重复的计算,省略不必要的计算 !
总结:
美滋滋 o(*≧▽≦)ツ |