目录
一、前言
本文主要讲了python字符串的部分操作及相关例题。
二、字符串处理
str1="12345678abcdefghi"
print(str1) #输出: 12345678abcdefghi
print(str1[3]) #输出: 4
print(str1[2:5]) #输出: 345(左闭右开)
print(str1[:5]) #输出:12345
print(str1[2:]) #输出: 345678abcdefghi
print(len(str1)) #输出字符串长度: 17
str2="***"
#合并字符串
str12=str1+str2
print(str12)
#也可以这样合并字符串
print(''.join([str1,str2]))
str_list=list(str1)
str_list.insert(4,"***") #在str1[4]插入
aa=''.join(str_list)
print(aa) #输出: 1234***5678abcdefghi
#重复输出
#str2="***"
print(str2*2) #输出:******
#用\输出特殊符号
print("\\ \" \n") #输出: \ " 换行
#查找子串
str3="abc"
print(str3 in str1) #输出: False
print(str3 not in str1) #输出: True
#交换
str2,str3=str3,str2
print(str2)
#比较
print(str2==str3)
print(str2!=str3)
#str.find(str,beg=0,end=len(string)) 指定范围查找
print(str1.find("345")) #输出: 2
print(str1.find("345",10)) #输出: -1
print(str1.find("456",2,20)) #输出: 3
三、例题
1、单词分析(lanqiaoOJ 504题)
【问题描述】
给一个单词,找到出现最多的字母和这个字母出现的次数。
【输入描述】
输入一行包含一个单词,单词只由小写英文字母组成。对于所有的评测用例,输入的单词长度不超过 1000。
【输出描述】
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
【样例输入】
lanqiao
【样例输出】
a
2
s=input()
n=[0]*256 #对应256个ASCII码
for ch in s: #逐个统计s的每一个字符
n[ord(ch)]=n[ord(ch)]+1
k=n.index(max(n))
print(chr(k))
print(max(n))
2、标题统计(lanqiaoOJ题号325)
【题目描述】
凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。
【输入描述】
输入文件只有一行,一个字符串 s (1<lsl<5)。
【输出描述】
输出只有一行,包含一个整数,即作文标题的字符数 (不含空格和换行符)。
s=input()
print(len(s.replace(' ','').replace('\n','')))
3、罗马数字(lanqiaoOJ题号276)
【题目链接】
【题目描述】
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现 0 的概念!
罗马数字的表示主要依赖以下几个基本符号(原题很长,请看链接):
I:1 V:5 X:10 L:50 C:100 D:500 M:1000
【输入描述】
第一行是整数 n (n<100),表示接下来有 n 个罗马数字。以后每行一个罗马数字。罗马数字大小不超过 999。
【输出描述】
要求程序输出 n 行,就是罗马数字对应的十进制数据。
【输入】
3
LXXX
XCIII
DCCII
【输出】
80
93
702
【运行限制】
- 最大运行时间:1s
- 最大运行内存: 256M
观察一下规律定义字典,简单易解。
dict={'I':1,'IV':4,'V':5,'IX':9,'X':10,'XL':40,'L':50,'XC':90,\
'C':100,'CD':400,'D':500,'CM':900,'M':1000}
n=int(input())
for _ in range(n):
ans=0
flag=0
s=input()
for i in range(len(s)):
if flag:
flag=0
continue
c=s[i]
if i+1<len(s):
if dict[c]<dict[s[i+1]]:
flag=1
c=s[i:i+2]
ans+=dict[c]
print(ans)
4、删除字符(lanqiaoOJ题号544)
【题目描述】
给定一个单词,请问在单词中删除 t 个字母后,能得到的字典序最小的单词是什么?
【输入描述】
输入的第一行包含一个单词,由大写英文字母组成。第二行包含一个正整数 t。其中,单词长度不超过 100,t 小于单词长度。
【输出描述】
输出一个单词,表示答案。
【输入】
LANQIAO
3【输出】
AIAO
【运行限制】
- 最大运行时间:1s
- 最大运行内存: 128M
【思路】
从头到尾遍历字符串,比较相邻的两个字符,删除较大的那个。
s=list(input())+[' '] #注意最后补一个空格
t=int(input())
for _ in range(t):
for i in range(0,len(s)):
if s[i]>s[i+1]:
s.remove(s[i])
break
print(''.join(s[:-1]))
#print(len(''.join(s[:-1])))
5、数位递增的数(lanqiaoOJ题号145)
【题目描述】
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数。例如 135 是一个数位递增的数,而 1024 不是一个数位递增的数。给定正整数 n ,请问在整数 1 至 n 中有多少个数位递增的数?
【输入描述】
输入的第一行包含一个整数 n (1<n<10^6)。
【输出描述】
输出一行包含一个整数,表示答案。
【输入】
30
【输出】
26
【思路】
n 比较小,暴力检查每个数字。如何判断一个数是数位递增的?一种简单的方法是把数变成一个字符串,然后按顺序判断每个字符的大小。转换为字符串后,用 sorted() 从小到大排序,如果排序前后一样,则是一个数位递增的数。
n=int(input())
ans=0
for i in range(1,n+1):
s=list(str(i))
if s==sorted(s): #注意不能用sort()
ans+=1
print(ans)
6、单词接龙(lanqiaoOJ题号769)
【题目描述】
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如
beast
和astonish
,如果接成一条龙则变为beastonish
,另外相邻的两部分不能存在包含关系,例如at
和atide
间不能相连。【输入描述】
输入的第一行为一个单独的整数 n (n≤20) 表示单词数。
以下 n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。
【输出描述】
输出以此字母开头的最长的“龙”的长度。
【输入】
5
at
touch
cheat
choose
tact
a
【输出】
23
【运行限制】
- 最大运行时间:1s
- 最大运行内存: 128M
【思路】
把所有字符串拼接在一起,输出最长的拼接。用 DFS 搜索所有可能的拼接,找到其中最长的拼接。代码中的 check() 函数,判断 s 和 m 是否能拼接,当 s 的后 k 个和 m 的前 k 个字符相同,则能拼接。
def check(x,y):
flag=0
for i in range(1,min(len(x),len(y))):
if x[-i:len(x)]==y[:i]:
flag=1
break
if flag:
if x[:len(x)-i] in y[i:] or y[i:] in x[:len(x)-i]:
return False
else:
return i
else:
return False
def dfs(dragon,x):
global ans
ans=max(len(dragon),ans)
for i in range(n):
if check(x,word[i])!=False and vis[i]<2:
r=dragon+word[i][check(x,word[i]):]
vis[i]+=1
dfs(r,word[i])
vis[i]-=1
n=int(input())
word=[]
for i in range(n):
word.append(input())
first=input()
ans=0
for i in range(n):
vis=[0]*n
if word[i][0]==first:
vis[i]+=1
res=word[i]
dfs(res,word[i])
print(ans)
以上,简单字符串
祝好