字符串旋转+{字符串in操作 } {split 操作}+字符串排序+数组跳转

2020年3月27日10:09:16

题目描述-字符串旋转:

给定两字符串A和B,如果能将A从中间某个位置分割为左右两部分字符串(都不为空串),并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。
例如:如果A=‘youzan’,B=‘zanyou’,A按‘you’‘zan’切割换位后得到‘zanyou’和B相同返回true。
输入描述:
2个不为空的字符串(说明:输入一个字符串以英文分号";"分割为2个字符串)
例如:youzan;zanyou 即为A=‘youzan’,B=‘zanyou’
输出描述:
输出true或false(表示是否能按要求匹配两个字符串)

第一次写的

想法:寻找最大匹配的字符串,从节点分割进行匹配判断,LCS问题
注意:
在这里插入图片描述

while True:
    try:
        string = input()
        index=string.find(';')
        string1=string[:index]
        index=index+1
        string2=string[index:]
        len1 = len(string1)
        len2 = len(string2)
        res = [[0 for i in range(len1+1)] for j in range(len2+1)] 
     #python 初始化二维数组 [len2+1],[len1+1]
        for i in range(1,len2+1):  #开始从1开始,到len2+1结束
            for j in range(1,len1+1):  #开始从1开始,到len2+1结束
                if string2[i-1] == string1[j-1]:
                    res[i][j] = res[i-1][j-1]+1
                else:
                    res[i][j] = max(res[i-1][j],res[i][j-1])
        ind=res[-1][-1]  #返回res[len2+1][len1+1]
        if (string1[:ind]==string2[len(string2)-ind:] and string1[ind:]==string2[:len(string2)-ind]) or (string2[:ind]==string1[len(string2)-ind:] and string2[ind:]==string1[:len(string2)-ind]):
            print('true')
        else:
            print('false')
    except:
        break

看到一个非常难以置信简洁的答案

链接:https://www.nowcoder.com/questionTerminal/cb27a2cc0e8b41cbbdab7b0ca5c1bc23?f=discussion
来源:牛客网

a, b = input().split(";")
if not len(a) == len(b):
    print("false")
    exit()
repeat = a + a
if b in repeat:
    print("true")
else:
    print("false")

字符串排序

1、python中的字符串类型是不允许直接修改元素的。必须先把要排序的字符串放在容器里,如list。

python中list容器的sort()函数没有返回值。所以在python中对字符串排序需要好几行代码:

s="string"
l=list(s)
l.sort()
s="".join(l)
print s    'ginrst'

一行代码搞定字符串排序的方法:

s="string"

s="".join((lambda x:(x.sort(),x)[1])(list(s)))

数组移动跳跃 -题目描述

给定一个非空的整数数组,从数组第一个元素(下标为0的元素)开始遍历进行移动,下一次向后或向前移动 该元素的值 的位数(值为正数向后移动,值为负数向前移动,值为零不移动),依次类推进行移动,若某次移动数组出现越界,则说明数组可以跳出,返回true;不能跳出则返回false;(加分项:也可考虑不增加使用其他集合数组辅助完成算法)
例1:
输入数组a[5] = [1,2,3,2,5];从第一个元素开始a[0]=1,下次向后移动1位到第二个元素a[1]=2,再次向后移动2位到第四个元素a[3],因为下次向后移动2位(a[3]=2)后,向后数组越界,即跳出数组,输出true;
例2:
输入数组a[2] = [1,-3];从第一个元素开始a[0]=1,下次移动1位到第二个元素a[1]=-3,再次向前移动3位后,向前数组越界,即跳出数组,输出true;

while True:
    try:
        b=input()
        b=b[1:len(b)-1]
        a=list(map(int,b.split(',')))
        b=[0 for i in range(len(a))]
        index=0
        flag=0
        while index>=0 and index<len(a):
            if b[index]==1:
                flag=1
                break
            else:
                b[index]=1
            index=index+a[index]
        if flag==1:
            print('false')
        else:
            print('true')
    except:
        break
发布了157 篇原创文章 · 获赞 94 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_42462804/article/details/105133919