题解 | #字符串计数#
字符串计数
https://www.nowcoder.com/practice/f72adfe389b84da7a4986bde2a886ec3
while True:
try:
inputs = list(map(str, input().split()))
s1 = inputs[0]
s2 = inputs[1]
len1 = int(inputs[2])
len2 = int(inputs[3])
#确定字母对应的范围
a = ord("a")
z = ord("z")
letter_set = {}
for i in range(26):
letter_set[chr(ord("a")+i)] = i
#在len1和len2之间考察
num = 0
for i in range(len1, len2+1):
#每一个长度i里只考虑s1,s2中的前i项,不足的就补一个0在后面,但是要求考察的这个数在这个长度下每一位都是满的
#s1,s2看作i位的26进制数字,不够的看为0,把它们转化为10进制数字n1,n2
n1 = 0
n2 = 0
for j in range(i):
if j <= len(s1):
n_tmp = ord(s1[j]) - a
n1 += n_tmp*26**(i - j - 1)
if j <= len(s2):
n_tmp = ord(s2[j]) - a
n2 += n_tmp*26**(i - j - 1)
num += n2 - n1
if i == len(s2):
num -= 1
print(num)
except:
break
就是把字母看成26进制的数字串,len1到len2为取头多少位构建一个26进制的数字,比如s1= ab, s2 = ce,遍历到长度为i = 1时候(i~[len1, len2]),当前步里只考察前1项,即a和c,由于是26进制,所以a=0,b=1...z=25,就想象数字0123456789本质也都是字母,0是当中在每一位中能出现的最小的数字,所以a=0;如果s1,s2没有i这么长,构建i位26进制数时就给后面都补上a,相当于补0。每一个i长度下,构建出s1,s2对应的26进制数后转换位10进制数n1,n2,那么在i长度下符合要求的组合数就是n2 - n1个。求出所有长度i下的组合数的和(当len1到len2中有一个长度等于s2的长度时是会包括一个跟s2的值一样的数,所以应该在该长度下减去1)。