leetcode-explore-learn-数据结构-数组3-字符串
- 1.简述
- 2.例题
- 2.1 二进制求和
- 2.2实现strStr()
- 2.3最长公共前缀
本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/array-and-string/198/introduction-to-array/768/
1.简述
字符串是字符构成的数组。
字符串一些常用的函数:
(1)比较函数,Python支持云算法重载,可以使用"=="来比较字符串。
(2)可修改性,在Python中字符串是一个不可改写的数组;一经定义只能访问字符串中的元素,而不能直接改变某个元素。在C++中字符串是可修改的。
(3)字符串连接,python 中支持两个字符串直接相加操作进行字符串连接
2.例题
2.1 二进制求和
给一个二进制字符串,返回他们的和,用二进制表示。
基本思想:
两个字符串诸位相加,设置一个符号位flag用于存储进位信息
难点边界条件的确定:char=int(a[i])+int(b[i])+flag,chat的可能取值:0,1,2,3
(1)i=[-1,-2,-l_min]遍历相加逐个元素至较短字符串遍历完成
(2) i=[-l_min-1,-l_min-2m,…,-l_max]:char=flag+int(a[i]),char的可能取值:0,1,2
(3)最后还需要检查是否有进位情况
class Solution(object):def addBinary(self, a, b):""":type a: str:type b: str:rtype: str"""res=[]l_a=len(a)l_b=len(b)l_min=min(l_a,l_b)l_max=max(l_a,l_b)flag=0for i in range(-1,-l_min-1,-1):char=int(a[i])+int(b[i])+flagflag=0if char==0:res.append(0)elif char==1:res.append(1)elif char==2:res.append(0)flag=1else:res.append(1)flag=1print (res,flag)if l_a>l_b:for i in range(-l_min-1,-l_max-1,-1):#print(i,res,flag)char=flag+int(a[i])flag=0if char==0:res.append(0)elif char==1:res.append(1)elif char==2 :res.append(0)flag=1if l_a<l_b:#print(l_min,l_max)for i in range(-l_min-1,-l_max-1,-1):#print(i,flag,res)char=flag+int(b[i])flag=0if char==0:res.append(0)elif char==1:res.append(1)elif char==2:res.append(0)flag=1#print(res,flag)if flag==1:res.append(1)l_res=len(res)res_s=""for i in range(l_res-1,-1,-1):res_s+=str(res[i])return res_
2.2实现strStr()
给定一个haystack字符串和一个needle字符串,在haystack字符串中找出needle字符串出现的第一个位置。如果不存在则返回0.
思路,遍历haystack字符串,找出needle字符串的第一个字符,然后依次往后找,直至所有都匹配上然后返回结果。
注意点:
(1)当needle是空时,如果返回-1(说明在一个字符串中找不到空字符串);如果返回0(说明haysta[0]开始的字符串匹配了空字符串)–c++语言中是这么定义的
(2)两个都为空时,返回0
(3)len(haystack)<len(needle)直接返回-1
class Solution(object):def strStr(self, haystack, needle):""":type haystack: str:type needle: str:rtype: int"""l_s=len(haystack)l_n=len(needle)if l_n==0:return 0if l_s==0:return -1if l_s<l_n:return -1for i in range(l_s-l_n+1): # i:[0,1,...,l_s-l-n]for j in range(l_n): # i:[0,1,...,l_n-1]l-s-l_n#print(i,j)if haystack[i+j]!=needle[j]:breakif j==l_n-1:return ireturn -1
2.3最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果公共前缀前缀不存在,返回空字符串""
用一个win区存公用前缀,找最短的字符串,将其元素依次加入win中。判断剩余字符串是否有该前缀字符。
class Solution(object):def longestCommonPrefix(self, strs):""":type strs: List[str]:rtype: str"""n=len(strs)if n==0:return ""short_index=-1l_min=float("INF")for i in range(n):if len(strs[i])<l_min:l_min=len(strs[i])short_index=iwin=""i=0while(i<l_min):win=strs[short_index][:i+1]for j in range(n):if strs[j][:i+1]!=win:return win[:i]i+=1return win