问题
有最大长度十万的多个字符串。任意给两个字符串的编号,返回这两个字符串的最长公共前缀长度。
输入:
第1行输入一个整数n,代表字符串数量,n最大为10000;
第2~n+1行,每行一个字符串,字符串长度最大为100000;
第n+2行开始,每行输入两个整数a和b,代表需要计算公共前缀的字符串编号。
输出:
返回a、b对应的字符串的最长公共前缀长度。如果a或b不是有效的字符串编号,则对该行不输出结果。
样例输入:
4
abcdefg
acdef
acdfghijk
cdfg
1 2
2 3
3 4
样例输出:
1
3
0
思路及代码
# 我写的,可正确输出。
n = 4
li = ["abcdefg", "acdef", "acdfghijk", "cdfg"]
nums = [[1, 2], [2, 3], [3, 4]]
l = len(nums)
for i in range(l):
count = 0
index1 = nums[i][0] - 1
index2 = nums[i][1] - 1 # 这里要减一,因为索引从 0 开始的!
length = min(len(li[index1]), len(li[index2]))
for j in range(length):
if li[index1][j] == li[index2][j]:
count += 1
else:
break
print(count)
# 网上的代码,有些写法可以学习一下。
n = int(input())
strs = []
for _ in range(n):
strs.append(input())
while True: # 不知道输入行数时,可以用【while True:】!!!
line = input()
if not line: # 如果输入为空,那么不再执行操作,并退出。
break
a,b = [ each-1 for each in list(map(int, line.split(' ')))] # 要减一!因为下标从 0 开始。
if a<0 or b<0 or a>n-1 or b>n-1:
continue
count = 0
for i in range(min(len(strs[a]), len(strs[a]))): # 只需要比较公共长度的字符。
if strs[a][i] == strs[b][i]:
count += 1
else:
break
print(count)
# 网上的代码,可以学一下 enumerate() 函数的使用,很巧妙。
def search(s1, s2):
count = 0
for idx, i in enumerate(s1): # 这里十分巧妙!
if i == s2[idx]:
count += 1
else:
break
return count
n, s = int(input()), []
for _ in range(n):
s.append(input())
while 1:
a, b = list(map(int, input().split()))
s1, s2 = s[a - 1], s[b - 1]
count = search(s1, s2) if len(s1) > len(s2) else search(s2, s1)
print(count)
知识点
1. enumerate() 函数的用法(参考:Python enumerate() 函数)
enumerate() 通常用在 for 循环中,同时列出其索引和数据。例如:
(1) 一般的 for 循环
s = ["one", "two", "three"]
i = 0
for element in s:
print(i)
print(s[i])
i += 1
>>> 0 one
1 two
2 three
(2) 使用 enumerate
s = ["one", "two", "three"]
for index, element in enumerate(s):
print(index)
print(element)
>>> 0 one
1 two
2 three
心得:enumerate 输出的,前面是索引,后面是数据。
2. 不知道输入长度时,用 while True 或 while 1。