{ }codelper
TODAY周五 · 2026

每日一题

编程,每天一点点,快乐学!

双指针字符编码P0155

从项链上剪下最短的一段

有一条把 n 颗珠子串成一圈的项链。
每颗珠子上刻着一个小写英文字母,项链字符串 S 的第 i 个字符就是第 i 颗珠子。
因为项链是圆的,第 n 颗珠子后面又是第 1 颗珠子。
要从项链上剪下连续的若干颗珠子,使得字符串 T 中的每个字母都至少拥有它在 T 中出现的次数。
剪下的珠子从某一颗开始沿编号增大的方向(第 n 颗之后是第 1 颗)连续,同一颗珠子不能用两次。
让剪下的珠子数尽可能少。
如果有多种方法,选起始珠子编号最小的。
把起始珠子的编号和剪下的珠子数用空格分隔输出在一行。
怎么剪都不行时输出 -1。

输入
第一行给出 S,第二行给出 T。
两者都只由小写英文字母组成。
1 ≤ S 的长度 n ≤ 100,000,1 ≤ T 的长度 ≤ 100,000
输出
起始珠子的编号和珠子数用空格分隔输出在一行,或 -1
样例 1 · stdin
cabbad
dc
stdout
6 2
样例 2 · stdin
ab
aa
stdout
-1
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

学习

从基础到排序、递归,每种语言都按同样的顺序学习;指针、类这类只有部分语言才有的内容,在对应的语言里学习。每一课都可以随时切换语言。

A

基础

4 课
  1. 01在屏幕上输出第一行代码:输出文字和计算结果。
  2. 02变量和值给值起个名字,以后可以再用或修改。
  3. 03读取输入从键盘(标准输入)读取文字和数字。
  4. 04计算和除法加减乘在各语言中一样,除法却各不相同。
B

流程控制

4 课
  1. 05条件语句根据条件做不同的事:if · else if · else,还有 switch。
  2. 06循环把同一件事做很多次:for 和 while。
  3. 07更多循环逐个取值、倒着循环、读到结束标记、至少执行一次的 do-while。
  4. 08布尔值与三元运算符把真假存进变量、在两个值里选一个、问“是不是其中之一”。
C

数据

5 课
  1. 09字符串长度、大写、反转、取出一个字符。
  2. 10列表和数组把多个值排成一列:个数、首尾、求和、全部转换。
  3. 11处理单个字符把一个字符当作值:编码、字符运算、第 i 个字符、重复。
  4. 12拼接构建字符串一段一段拼出字符串、用分隔符连接、在一行里连着输出。
  5. 13修改列表判断是否包含、移除、反转、交换、用同一个值填充、复制。
D

函数

2 课
  1. 14函数给一段工作起名字,接收值并返回结果,还有递归。
  2. 15函数进阶变量的作用域、返回多个值、把函数当作值来传递。
E

进阶

10 课
  1. 16字典(映射)按键查找和修改值:统计单词、判断键是否存在、按键的顺序遍历。
  2. 17排序从小到大、从大到小,或按自己定的规则排列。
  3. 18二维列表(网格)由行和列组成的网格:读取、行和与列和,只在范围内查看相邻格子。
  4. 19字符串处理截取、查找、替换、去除首尾空白、比较、补齐对齐。
  5. 20整数与浮点数为什么 0.1 + 0.2 不等于 0.3,固定小数位输出,舍入规则,以及整数溢出。
  6. 21递归函数调用自己:终止条件、调用栈深度、循环与记忆化。
  7. 22常见错误与错误信息如何阅读错误信息,以及各种语言都会犯的错误:差一位、= 与 ==、整数除法、null、下标越界。
  8. 23绝对值、乘方、平方根去掉符号、连乘多次、求平方后等于某数的值。
  9. 24计数、累计、分组遍历一次:数出符合条件的个数,带着“到目前为止”的值,按键把数据归到一起。
  10. 25记录列表与枚举把记录收进列表,给固定的几种取值起名字。
F

算法

8 课
  1. 26模拟与暴力枚举照着题目的故事一步一步做,把候选一个不漏地都试一遍。
  2. 27栈与队列栈先取出后放入的,队列先取出先放入的。
  3. 28二分查找把有序的范围每次丢掉一半,找到某个值,或者第一个满足条件的位置。
  4. 29前缀和与双指针用一次减法求出区间和;让两个位置只向前移动来寻找区间。
  5. 30最大公约数、素数与进制用余数求最大公约数,用筛法筛出素数,把数写成别的进制。
  6. 31贪心与优先队列每一步都选眼下看起来最好的,再用一个能马上交出最小值的队列。
  7. 32图与深度优先搜索记下谁和谁相连,再把能到的地方一个不漏地走一遍。
  8. 33广度优先搜索与拓扑排序用队列从近处向外扩展求最少步数,并把任务排成先决条件在前的顺序。
G

各语言特有

10 课
  1. 34指针C++ · C带着值所在的位置(地址)走,修改调用方的变量。
  2. 35动态内存C++ · C在运行时按需要的大小借用内存,用完一定要归还。
  3. 36结构体C# · C++ · C把相关的值打包成一个整体,并弄清这个整体是被复制还是被共享。
  4. 37类与对象Python · JavaScript · TypeScript · Java · C# · C++把数据(字段)和行为(方法)放进同一个模板,再用它创建多个对象。
  5. 38接口与泛型TypeScript · Java · C#用接口约定“有这些方法”,用泛型让一个函数适用于多种类型。
  6. 39LINQ 与流Java · C#把筛选、转换、分组、排序连成一条管道,代替手写循环。
  7. 40Python 风格的代码Python推导式、带步长的切片、解包、enumerate 和 zip、in、f 字符串,以及三个陷阱。
  8. 41JavaScript 的相等与真假JavaScript · TypeScript== 与 ===、假值、?? 与 ||、全是 double 的数字、undefined 与 null,以及 TypeScript 能拦住的问题。
  9. 42C++ 引用与 STLC++& 引用和 const 引用,vector、map、set、unordered_map,接收 lambda 的算法,以及复制、失效、自动插入三个陷阱。
  10. 43Craykon 独有的规则Craykon用母语写的关键字、会让计算停下的“空”、严格的 ==、不会往下贯穿的选择。

题库

每道题都有它所接受的所有语言的参考解答(大多是 8 种语言;指针、类这类因语言而异的题只接受相应语言),并经机器验证输出完全一致。

  1. 誊写留言簿的一行8P0311
  2. 两数之和8P0001
  3. 把加分后的分数用逗号连起来8P0373
  4. 依次传弹珠8P0251
  5. 个子矮的站前面8P0344
  6. 四行真与假8P0217
  7. 由座位编码求票号8P0226
  8. 没有折扣价就按原价8P0281
  9. 每升油能跑多远8P0216
  10. 各位数字之和8P0006
  11. 棋盘格距离8P0017
  12. 放进正方形相框的照片8P0254
  13. 评定等级8P0011
  14. 闰年判断8P0019
  15. 寄存柜的加收费用8P0372
  16. 三天气温的走势8P0227
  17. 拍手游戏8P0002
  18. 星号三角形8P0007
  19. 乘法表的一行8P0022
  20. 掷出尤或谋就再掷一次8P0255
  21. 第一个倍数8P0023
  22. 路的尽头也要立的路灯8P0371
  23. 每天多读一些的读书马拉松8P0282
  24. 统计元音8P0009
  25. 字符第一次和最后一次出现的位置8P0053
  26. 沿对角线取字母8P0283
  27. 统计单词8P0012
  28. 回文判断8P0004
  29. 符号不动,倒着写8P0252
  30. 大小写互换8P0025
  31. 最大数及其位置8P0005
  32. 要补考的学生编号8P0374
  33. 显示留言板的一页8P0284
  34. 数字排序8P0036
  35. 整理招牌字块8P0253
  36. 在名单里吗8P0059
  37. 两两结对交换位置8P0312
  38. 轮流投出的飞镖得分8P0342
  39. 不低于平均的早晨8P0343
  40. 指针出不了刻度的温度计8P0402
  41. 落在沙坑里的球8P0285
  42. 给歌词加上行号8P0347
  43. 分数统计8P0003
  44. 和手里的钱正好相等吗8P0043
  45. 一直加到结束8P0018
  46. 秤上显示的重量8P0221
  47. 交换卡片8P0046
  48. 大数求和8P0015
  49. 截断、向下取整、四舍五入8P0044
  50. 一旦响起就一直响到关闭的警笛8P0289
  51. 字母链8P0045
  52. 游乐设施的限员8P0086
  53. 查三次找到电源箱负责人8P0286
  54. 批改加法作业8P0222
  55. 秒数转时:分:秒8P0013
  56. 罚球命中率记录表8P0314
  57. k 天后是星期几8P0016
  58. 四舍六入五成双8P0048
  59. 不超过的乘方8P0050
  60. 离目标最近的数8P0218
  61. 平方根在哪里8P0049
  62. 会员折扣和配送费8P0191
  63. 放风筝告示板8P0315
  64. 三个数的中间值8P0020
  65. 四则计算器8P0021
  66. 密码规则检查8P0098
  67. 斐波那契数8P0010
  68. 数气温纪录被刷新几次8P0219
  69. 数位数8P0052
  70. 按顺序装快递卡车8P0223
  71. 跳着倒数8P0024
  72. 直到 0 的累计和8P0051
  73. 夹有韩文的短信还剩几个字符8P0341
  74. 纸条里的字母编号8P0192
  75. 截取第 a 到第 b 个字符8P0054
  76. 反转单词顺序8P0028
  77. 各翻转一半的暗号纸条8P0316
  78. 字母金字塔8P0097
  79. 凯撒密码8P0026
  80. 把大小写花样印过去8P0230
  81. 全部查找替换8P0055
  82. 统计重叠出现次数8P0030
  83. 按字典序比较两个单词8P0056
  84. 名字右对齐8P0029
  85. 去掉每行首尾的空白8P0057
  86. 游程压缩8P0027
  87. 数字带的片段8P0095
  88. 单向公交线路的用时8P0224
  89. 删除所有相同的值8P0058
  90. 列表向右旋转8P0032
  91. 行和与列和8P0033
  92. 数值顺序和字典顺序8P0320
  93. 遮住聊天里的违禁词8P0194
  94. 只改副本8P0060
  95. 在格子上盖章8P0061
  96. 最矮的站最前,最高的站最后8P0317
  97. 第二大的数8P0031
  98. 班级平均分与年级平均分8P0225
  99. 按扫描顺序数商品8P0220
  100. 电话簿查找8P0063
  101. 只算最后一票的投票8P0228
  102. 找出互相选择的搭档8P0256
  103. 按零件编码范围查库存8P0229
  104. 删除重复的数8P0035
  105. 凑满 k 人就出发的体验摊位8P0349
  106. 素数判断8P0008
  107. 带默认值的箱子数函数8P0257
  108. 整齐的储物柜号码8P0196
  109. 接收标准函数,选出第一名的单词8P0318
  110. 两臂不等长的天平8P0345
  111. 坐成一排的萤火虫8P0350
  112. 圆桌上每隔 k 个座位放的糖8P0313
  113. 数一数倒过来也是素数的数8P0258
  114. 转换为二进制8P0038
  115. 公交车最拥挤的路段8P0259
  116. 合并两个入口的入场记录8P0260
  117. 管理员抽出来看过的书8P0375
  118. 生日先到的朋友排在前面8P0376
  119. 最少硬币数8P0041
  120. 爬楼梯的方法数8P0042
  121. 食堂的餐盘堆8P0348
  122. 先到先得的借伞处8P0351
  123. 炉子的暖意在教室里扩散8P0378
  124. 捉迷藏里找人者走过的路8P0377
  125. 照着岔路纸条走8P0380
  126. 只凭线索就能确定的名次8P0381
  127. 先切最长的年糕条8P0379
  128. 咖啡店集点卡6P0261
  129. 会用字符串报告自己状态的游戏角色6P0346
  130. 周末农场的地块记录簿8P0319
  131. 乌龟面朝哪边6P0077
  132. 依次使用的折扣券5P0199
  133. 用指针带回最小值、最大值与和2P0073
  134. 用指针走出最长的一段2P0074
  135. 把单词存起来2P0075
  136. 指向同一个列表的名牌8P0262
  137. 撞墙就退回的机器人3P0203
  138. 转置并筛选表格1P0083
  139. 一个类用两次的最近列表4P0204
  140. 二手市场搜索框6P0263
  141. 核对车锁记录8P0287
  142. 新储物柜的左右邻居8P0288
  143. 货架标签校验字符8P0161
  144. 把用反斜杠续写的行展开8P0325
  145. 随处换行的秤记录8P0231
  146. 销售记录合计8P0102
  147. 气温条带图8P0164
  148. 块与被遮蔽的变量8P0087
  149. 飞镖记分板:每个值的寿命不同8P0328
  150. 运行排序网络8P0133
  151. 二进制小数能除尽吗8P0359
  152. 权限位检查器8P0132
  153. 检查修学旅行报名表8P0324
  154. 制作班车时刻表8P0163
  155. 流量套餐的超额费用8P0387
  156. 空白用前一个值补上8P0047
  157. 每个轮子格数不同的计数器8P0266
  158. 世界各城市的会议时间8P0166
  159. 按人数调整菜谱分量8P0232
  160. 零件尺寸公差检查8P0134
  161. 送货无人机飞了多远8P0233
  162. 照亮步道的路灯8P0389
  163. 快递价目表8P0167
  164. 停车费计算器8P0136
  165. 把乐谱移动 k 个半音8P0401
  166. 按周岁收的门票8P0169
  167. 数瓷砖墙上贴广告牌的位置8P0270
  168. 掷出 6 就再掷一次的骰子游戏8P0264
  169. 两人都有空的天数表8P0234
  170. 多月日历8P0126
  171. 自动售货机找零8P0127
  172. 带逗号的存取款账本8P0173
  173. 按累进税率计算所得税8P0137
  174. 没有 0 层的电梯运行记录8P0235
  175. 用一只手打出的最长一段8P0269
  176. 标出两行的不同之处8P0143
  177. 整理网址路径8P0144
  178. 按宽度换行8P0104
  179. 读取地址后面的设置8P0236
  180. 贴在玻璃窗上的镜像字8P0174
  181. 横向条形报告8P0175
  182. 带例外单词的标题格式8P0145
  183. 模板填空8P0101
  184. 查找下一个与查找上一个8P0356
  185. 忽略大小写排序8P0103
  186. 词典页的书眉词8P0386
  187. 制作成绩表8P0096
  188. 附上搜索条件,拼出完整链接8P0290
  189. 越赢越累的淘汰赛8P0180
  190. 青蛙过石头8P0193
  191. 编辑播放列表8P0110
  192. 最佳连续区间的平均值8P0106
  193. 折纸带8P0354
  194. 菜谱缺少的材料8P0237
  195. 把列表存进存档位再读取8P0107
  196. 螺旋填数8P0128
  197. 问卷回答竖直柱状图8P0150
  198. 反转区间的函数8P0062
  199. 换座位之后挪动的学生8P0176
  200. 按区间整理仓库货架8P0177
  201. 温差最大的一天8P0238
  202. 核对写有小计的收据8P0268
  203. 平均分保留两位小数8P0014
  204. 单词频率排名8P0034
  205. 仓库补货报告8P0147
  206. 商店库存管理8P0064
  207. 实时前三名8P0109
  208. 合并相册标签8P0388
  209. 按编号排列的名册8P0065
  210. 并集、交集、差集8P0099
  211. 踩上去就翻面的地砖8P0352
  212. 按首字母分组8P0066
  213. 用珠子最少的算盘8P0355
  214. 可以接收任意个评分的函数8P0333
  215. 会议室预约时间检查器8P0149
  216. 先走一步的子女的份额归孙辈8P0265
  217. 传入规则函数来整理数列8P0239
  218. 向左折叠,向右折叠8P0329
  219. 从磨损的按键缩小密码范围8P0321
  220. 最大公约数与最小公倍数8P0037
  221. 分数相加并约分8P0094
  222. 数出三座灯塔重叠闪烁的时刻8P0322
  223. 拆成两个素数之和8P0068
  224. a 进制转 b 进制8P0093
  225. 去掉忌讳数字的号码牌8P0358
  226. 快速求区间和8P0039
  227. 有序数列中和为 S 的两个数8P0069
  228. 会议室什么时候空8P0240
  229. 标志之间的高度8P0327
  230. 一间会议室安排最多会议8P0090
  231. 连击会累积的节奏游戏8P0267
  232. 括号匹配8P0040
  233. 售票处排队8P0071
  234. 门一扇扇上锁的博物馆8P0291
  235. 折叠的评论串的行号8P0292
  236. 共同好友最多的人8P0293
  237. 遵守先修课的学期计划8P0197
  238. 只重做过期的文件8P0326
  239. 先借出骑得最少的自行车8P0294
  240. 银行账户对象6P0078
  241. 共用的号码牌6P0079
  242. 不同员工类型的工资6P0157
  243. 成绩排名表8P0067
  244. 积分榜6P0080
  245. 一起流动的沙漏6P0323
  246. 订单状态机6P0156
  247. 按级别筛选日志6P0357
  248. 通用的最大值3P0081
  249. 按能做的事归类的智能家居设备5P0383
  250. 用指针的指针摘下车厢2P0201
  251. 按两倍增长的数组2P0158
  252. 被复制的机器人3P0076
  253. 要么全出、要么一个不出的自动售货机3P0382
  254. 反转选课名单1P0123
  255. 笔记本和笔的礼品套装8P0353
  256. 两边都能查的配对账本4P0384
  257. 按城市汇总订单2P0082
  258. 整理寻宝时挖过的格子6P0385
  259. 宽松相等与严格相等2P0084
  260. 判断相同的四种方法2P0124
  261. 按引用传递的库存账本1P0085
  262. 在车辆段连挂列车4P0207
  263. 让文件大小更易读8P0135
  264. 过滤并归并服务器日志8P0165
  265. 整理自行车分段记录8P0162
  266. 读取混有逗号和注释的测量记录8P0392
  267. 整理一叠信件8P0295
  268. 收据打印机的格式字符串8P0241
  269. 打印字节转储表8P0396
  270. 进度条留下的字符8P0271
  271. 用数字字体印横幅8P0404
  272. 还没放入值就使用的变量8P0360
  273. 一次性赋值的计算器格子8P0272
  274. 存款复利利息表8P0131
  275. 装进更小的类型8P0397
  276. 坏掉的传感器和警报8P0362
  277. 解开控制字符的写法8P0300
  278. 几天后、几天前的日期8P0170
  279. 按股份分账后剩下的1元8P0363
  280. 传感器读数的平均值与标准差8P0168
  281. 洒水器能浇到的花盆8P0129
  282. 买卖机器人:一天只做一件事8P0330
  283. 电视遥控器按键8P0242
  284. 按模板检查商品编码8P0273
  285. 按规则顺序比较商品8P0301
  286. 每隔几条取出拼布的斜线8P0335
  287. 飞镖减分游戏8P0140
  288. 史莱姆狩猎日志8P0390
  289. 把数字排好再相减,不断重复8P0209
  290. 巴比伦平方根8P0130
  291. 等待后重试8P0138
  292. 用字符画的尺子8P0172
  293. 倒着回放作业记录,找出最初的队列8P0331
  294. 越升越远的下一级8P0296
  295. 跟踪 ATM 的状态8P0139
  296. 又转又翻的字符带8P0297
  297. 模仿 Python 的 a:b:c 切片8P0274
  298. 把长文件名从中间缩短8P0395
  299. 拆分带引号的 CSV8P0105
  300. 制作书末索引8P0302
  301. 从背面读编织图8P0332
  302. 一次性替换的剧本修改8P0243
  303. 遮住日志里的秘密值8P0171
  304. 文件名自然排序8P0142
  305. 生成 Markdown 目录8P0141
  306. 整理配置文件中的值8P0393
  307. 整理卡片行的命令8P0244
  308. 复制、剪切再粘贴8P0298
  309. 前后翻看合影的站法8P0208
  310. 按屏幕上还留着的话过滤刷屏8P0391
  311. 小剧场订座与候补队列8P0146
  312. 选一家谁都不会太失望的餐厅8P0334
  313. 观测站平均气温排名8P0195
  314. 分类预算账本8P0178
  315. 排序投票的决选8P0148
  316. 小图书馆的借阅账本8P0179
  317. 在无边的板上铺电线8P0364
  318. 整理仓库各格的库存账本8P0394
  319. 字母异位词分组8P0108
  320. 把比例相同的菜谱归组8P0280
  321. 用韩文读数8P0200
  322. 只计算被选中一侧的计算树8P0275
  323. 绑定命名参数8P0361
  324. 没有被攻击的棋子8P0299
  325. 字母排列8P0100
  326. 读取用时写法8P0366
  327. 用静态作用域和动态作用域各运行一次8P0245
  328. 红绿灯前的车8P0114
  329. 只有两个按钮的电梯8P0181
  330. 搭一列齿轮8P0185
  331. 统计相乘素数恰为 k 个的数8P0113
  332. 账本污迹里的素数8P0182
  333. 快速求网格中矩形的和8P0092
  334. 差不超过 k 的两个数8P0112
  335. 从项链上剪下最短的一段8P0155
  336. 把丝带剪成等长8P0070
  337. 备份磁盘的容量8P0111
  338. 按快车会超车的时刻表换乘8P0304
  339. 用硬币凑出金额的方法数8P0088
  340. 最长上升子序列8P0089
  341. 装背包8P0116
  342. 最长公共子序列8P0117
  343. 修改字幕的最便宜方法8P0153
  344. 右边第一个更大的数8P0091
  345. 带撤销和重做的记事本8P0187
  346. 轮流工作的 CPU8P0115
  347. 用两个水壶刚好量出的操作顺序8P0210
  348. 边捡钥匙边摸索的洞穴探险8P0190
  349. 朋友圈8P0118
  350. 庆典准备工作的宽裕时间8P0303
  351. 用链式调用的方法修改房间平面图6P0276
  352. 装满就出发的快递卡车8P0247
  353. 五个骰子的牌型6P0198
  354. 任务队列与中位数3P0121
  355. 用指针数组排出的箱子名次表2P0246
  356. 每行长度不同的表2P0202
  357. 小小的堆管理员8P0365
  358. 用引用修改,用 lower_bound 查找1P0125
  359. 被复制的冒险者与共用的金库3P0159
  360. 制作答卷评分表1P0206
  361. 每关前 k 名2P0122
  362. 核对商品表和订单表2P0160
  363. 完全相同的包裹与内容相同的包裹8P0205
  364. 画文件夹树8P0248
  365. 在嵌套块中查找名字8P0183
  366. 圆桌座位规则8P0184
  367. 瓷砖墙和角上的数字8P0399
  368. 没事可做就掉头的电梯8P0250
  369. 把方格纸不剩地剪成正方形8P0367
  370. 三色丝带的最长小段8P0398
  371. 只能分成小质数的数8P0340
  372. 把循环小数换成另一种进制8P0403
  373. 越远越凉的篝火与营地的温暖8P0307
  374. 给圆桌上菜8P0369
  375. 最累的一段坐缆车翻过的山脊路8P0306
  376. 挑选晒柿饼的日子8P0368
  377. 把路灯的光同样加长8P0213
  378. 晚点的线路与第 k 趟列车8P0370
  379. 按输入给出的列规则给表格排序8P0308
  380. 挑选能在截止前完成的 3D 打印订单8P0152
  381. 每个时段都要有k人的通宵值班8P0310
  382. 水流走的方法数8P0154
  383. 冰箱里该存多少零食8P0214
  384. 亮 S 根灯管的号码8P0279
  385. 不能照着拿的取弹珠8P0339
  386. 加法优先的取余计算器8P0186
  387. 用命名保存点回退的账本8P0305
  388. 在成组书写的串珠图样里数相邻的两种颜色8P0400
  389. 开裂就冷却后重新排队的窑炉队伍8P0309
  390. 最多打破 K 堵墙的捷径8P0119
  391. 邻居多的一方占领的颜料晕染8P0188
  392. 每踩一次就翻转的门8P0249
  393. 只在奇数分钟、偶数分钟开放的桥8P0336
  394. 岛屿地图8P0072
  395. 匹配版本范围的软件包安装器8P0189
  396. 从下往上跳闸的断路器8P0337
  397. 一路换电池的无人机8P0151
  398. 只破一根就断水的水管8P0212
  399. 关注的人走了就退出的群聊8P0278
  400. 安排任务顺序8P0120
  401. 单元格会互相引用的计算表8P0215
  402. 连带删除不再需要的软件包8P0338
  403. 先卖保质期最早的面包店8P0211
  404. 越等越急的看诊顺序8P0277

全部题目 →