简单字符串

目录

一、前言

二、字符串处理

三、例题

1、单词分析(lanqiaoOJ 504题)

2、标题统计(lanqiaoOJ题号325)

3、罗马数字(lanqiaoOJ题号276)

4、删除字符(lanqiaoOJ题号544)

5、数位递增的数(lanqiaoOJ题号145)

6、单词接龙(lanqiaoOJ题号769)


一、前言

本文主要讲了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)

以上,简单字符串

祝好

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吕飞雨的头发不能秃

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

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

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

打赏作者

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

抵扣说明:

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

余额充值