问题

有最大长度十万的多个字符串。任意给两个字符串的编号,返回这两个字符串的最长公共前缀长度。

输入:

第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。

08-24 11:57