LeetCode 5-8 (5是昨天写完的)

LeetCode 5 最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

示例 2:

输入: “cbbd”
输出: “bb”

基本想法是两个for循环,第一个for循环用来选定原点的元素,第二个for循环确定原点两侧元素是否相等。第一个循环是从1到L-1,第二个循环是1到min(i-0+1,L-i)表示最大可以移动的范围。

但是有情况需要单独判断如**‘baa’**,当原点是1是,判断a左侧和右侧平不相等所以会输出a,但是实际应该是aa,所以如果不满足左侧等于右侧还要判断原点和左侧或者右侧是否相等。

还有情况是**’baaaab‘** , 输出会是aaa。但实际输出应该为baaaab,因为上述情况只能判别最大回文字串的长度是偶数的情况,所以又加了if,当原点左右两侧相等时候再判断,当前最大字串‘aaa’的第0位和最后一位是否与最大回文在原字符串位置的前一位或者后一位相等,判断后的输出是aaaa。结果还是不对,就又加了个子函数判断回文子串所在原字符串所在位置的前一位和后一位是否相等,这个子函数和上面的if功能并不一样。

其他的特殊情况如输入为空,输入是**‘bb’**只能单独判断了。

def com(a,b,c=''):
    if a.find(b)==-1:
        return a
    else:
        start=a.find(b)
        l=len(b)
        end=start+l-1
        L=len(a)

        if start-1>-1 and end+10 and max[0]==a[i-j-1]:
                max=a[i-j-1]+max
                max=com(a,max)
            if i+j+1len(c):
                c=max

        else:
            if a[i]==a[i+j]:
                max=a[i:i+j+1]
                if len(max) > len(c):
                    c = max

            elif a[i]==a[i-j]:
                max=a[i-j:i+1]
                if len(max) > len(c):
                    c = max
            else :

                if len(max) > len(c):
                    c = max
                break


print(c)

LeetCode 5-8 (5是昨天写完的)_第1张图片

提交到LEETCODE结果和本地不一样,可能是缩进问题,改了一个多小时也不行,但是本地结果是没问题的。所以就不提交了,应该是没有问题的。
LeetCode 5-8 (5是昨天写完的)_第2张图片
LeetCode 5-8 (5是昨天写完的)_第3张图片

LeetCode 6 Z字形变换

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

L C I R
E T O E S I I G
E D H N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。

示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”

示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”

解释:
L D R
E O E I I
E C I H N
T S G

看着很麻烦,不过第一时间就想到了用图像的方法。先把字符串按照规则画到一个图像上。现要求出来图像(二维矩阵)的高和宽,题目已经给出,宽根据规则也可以算出来。
然后按列遍历矩阵如果列数是满足num-1的整数倍那么就以此填充,如果不是那么就按照规则填充。

import  math
a="PAYPALISHIRING"
L=len(a)
num=3
times=math.floor(L/(num+num-2))
remain=L%(num+num-2)

k=0
shift=0

c=''
if (remainnum:
    remain=remain%num+1
comlu=times*(num-1)+remain

numsList = []

for row in range(num):
    numsList.append([])
    for column in range(comlu):
        b = ''
        numsList[row].append(b)


for i in range(comlu):



     if i%(num-1)==0:
        shift=0
        for j in range(num):
          if k == L:
            break
          numsList[j][i]=a[k]
          k=k+1
     else:
        numsList[num-2-shift][i]=a[k]
        k=k+1
        shift=shift+1



for i in range(num):
    for j in range(comlu):
        c=c+numsList[i][j]

print(c)

LeetCode 7 整数反转

没有什么难度,不过最优的算法需要动脑筋。

a=-123
a = str(a)
if a[0] is '-':
    a=a[1:]
    result = a[::-1]
    result = -1 * (int(result))
else:
    result = a[::-1]
    result = int(result)
print(result)

LeetCode 8 字符串转化整数

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0 。

示例 3:
输入: “4193 with words”
输出: 4193
解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。

示例 4:
输入: “words and 987”
输出: 0
解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。
因此无法执行有效的转换。

一看题目感觉不难,几个if就可以了。然后点开了题解,发现了新天地!!!

正则表示

我的天这东西太神奇了吧!!!!
LeetCode 5-8 (5是昨天写完的)_第4张图片
一行代码全部解决!!!!

你可能感兴趣的:(算法,python)