【编程算法Ⅰ】循环单词、组装三角形、最长公共连续子串(Python解法)

本文详细介绍了如何解决两种算法问题:1)计算一组单词中的循环单词种类,通过比较和组合实现;2)计算能组成三角形的不同组合数,通过排序和三重循环检查三角形性质。此外,还提供了两种问题的解题代码,包括常规和进阶版本,以及最长公共连续子串问题的动态规划解决方案。
摘要由CSDN通过智能技术生成

目录

1、循环单词

1.1、题目描述

1.2、解题

Ⅰ思路:

Ⅱ操作:

Ⅲ常规代码:

Ⅳ进阶代码:

2、组装三角形

2.1、题目描述

2.2、解题

Ⅰ思路:

Ⅱ操作:

Ⅲ解题代码:

3、最长公共连续子串

3.1、题目描述

 3.2、解题

Ⅰ思路:

Ⅱ操作:

Ⅲ解题代码:

总结


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)


总结

大家如果有疑问都可以评论提出,有不足之处请大家批评指正,希望能多结识这方面的朋友,共同学习、共同进步。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值