目录
1、循环单词
1.1、题目描述
如果一个单词通过循环右移获得的单词,我们称这些单词都为一种循环单词。 例如:picture 和 turepic 就是属于同一种循环单词。 现在给出n个单词,需要统计这个n个单词中有多少种循环单词。
1.2、解题
Ⅰ思路:
一个单词通过循环右移获得的单词,他们就是一种循环单词,例如picture 和 turepic 就是属于同一种循环单词 此题的目的在于寻找循环单词的种数,如果给出的n个单词任2都不属于同一种循环单词,那么就有n种循环单词。
Ⅱ操作:
①输入元素赋值和入列表;
②定义handle函数,遍历res列表中的元素—j,判断自变量i与j是否是一对循环单词,如果是,flag赋值0,跳出循环;如果不是,结束循环后,res列表加上2*自变量i(循环单词解法)
③赋值空列表res,遍历题目输入的单词,每个单词进行handle函数操作
④最后res列表元素的数量就是循环单词的种类,打印输出
Ⅲ常规代码:
n = int(input())
word = []
for i in range(n):
word.append(input())
def handle(i):
flag = 1
for j in res:
if (i in j) and len(j) == 2 * len(i):
flag = 0
break #不加break也行,加是为了加大速度
if flag == 1:
res.append(i + i)
res = []
for i in word:
handle(i)
print(len(res))
Ⅳ进阶代码:
进阶代码是合并了上述代码的一些步骤,使得行文更加简洁,也容易理解,不过解决该问题的方法是一样的,但是一般不容易想到这个进阶方法。
n = int(input())
res = []
for i in range(n):
flag = 1
s = input()
for j in res:
if (s in j) and len(j) == 2*len(s):
flag = 0
break #不加break也行,加是为了加大速度
if flag == 1:
res.append(s+s)
print(len(res))
2、组装三角形
2.1、题目描述
牛牛手里有N根木棒,分别编号为1~N,现在他从N根里想取出三根木棒,使得三根木棒构成一个三角形,你能计算出牛牛有多少种取法吗?(考虑两种取法中使用的木棒编号有一个不一样就认为是不同的取法)。
2.2、解题
Ⅰ思路:
组装三角形的本质还是在于三角形的性质——两边之和大于第三边,同时需要对每三个元素进行遍历比对 解法核心在于排序,元素排序后,按正序进行三层遍历,最后对三层元素进行比对。
Ⅱ操作:
①输入元素赋值和入列表,列表中元素排序;
②对排序后的数组进行正序三层遍历,一层是i-(n-2)位元素,二层是(i+1)-(n-1)位元素,也就是说二层元素选取是在一层元素位置之后,同理三层元素的选取在二层元素之后,严格遵守此逻辑,因为排序后三层元素大小依次递增,所以只需要比对前两层之和与第三层元素的大小,如果前两层之和小于则跳出,否则num+1(符合三角形的性质);
③打印num。
Ⅲ解题代码:
n = int(input())
lis = list(map(int,input().split(' ')))
lis.sort() #原数组进行排序
num = 0
for i in range(n-2):
for j in range(i+1,n-1):
for k in range(j+1,n):
if lis[i]+lis[j] <= lis[k]:
break
else:
num+=1
print(num)
3、最长公共连续子串
3.1、题目描述
牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度。
3.2、解题
Ⅰ思路:
本题因为连续和求长度难度降低很多,比如”abcde“和”abde“两字符串,最长公共子序列就是ab或de,那么长度就是2,本题通过动态规划(dp)求解
Ⅱ操作:
①输入元素赋值,构建dp矩阵;
②二层(a,b字符串)遍历dp矩阵,一般是先行后列,if两层元素相同,dp[i+1][j+1]=dp[i][j]+1,锁定这个元素,假如字符串接下来连续的元素相同,可继续加1;if两层元素不相同,dp[i+1][j+1]=0,表明连续中断,之后可继续正常匹配;ans的作用就是找出连续子序列最长的长度
③打印ans
Ⅲ解题代码:
a,b=input(),input()
m,n=len(a),len(b)
dp=[[0 for i in range(n+1)] for j in range(m+1)]#里边n+1是列,外边m+1是行
ans = 0
for i in range(m):
for j in range(n):
if a[i] == b[j]:
dp[i+1][j+1] = dp[i][j]+1
if dp[i+1][j+1] > ans:
ans = dp[i+1][j+1]
else:
dp[i+1][j+1] = 0
print(dp)
总结
大家如果有疑问都可以评论提出,有不足之处请大家批评指正,希望能多结识这方面的朋友,共同学习、共同进步。