Anagrams by Stack | Python 实现

article/2025/9/18 16:01:31

目录

1.题面

2.注意事项:

0.OJ平台

1.无限流输入 、EOF输入流

2.返回中的空格

 3.AC代码


1.题面

Anagrams by Stack

Time Limit: 2000 msMemory Limit: 65536 KB

How can anagrams result from sequences of stack operations? There are two sequences of stack operators which can convert TROT to TORT:

[
i i i i o o o o
i o i i o o i o
]

where i stands for Push and o stands for Pop. Your program should, given pairs of words produce sequences of stack operations which convert the first word to the second.

Input

The input will consist of several lines of input. The first line of each pair of input lines is to be considered as a source word (which does not include the end-of-line character). The second line (again, not including the end-of-line character) of each pair is a target word. The end of input is marked by end of file.

Output

For each input pair, your program should produce a sorted list of valid sequences of i and o which produce the target word from the source word. Each list should be delimited by

[
]

and the sequences should be printed in "dictionary order". Within each sequence, each i and o is followed by a single space and each sequence is terminated by a new line.

Process

A stack is a data storage and retrieval structure permitting two operations:

Push - to insert an item and
Pop - to retrieve the most recently pushed item

We will use the symbol i (in) for push and o (out) for pop operations for an initially empty stack of characters. Given an input word, some sequences of push and pop operations are valid in that every character of the word is both pushed and popped, and furthermore, no attempt is ever made to pop the empty stack. For example, if the word FOO is input, then the sequence:

i i o i o ois valid, but
i i ois not (it's too short), neither is
i i o o o i(there's an illegal pop of an empty stack)

Valid sequences yield rearrangements of the letters in an input word. For example, the input word FOO and the sequence i i o i o o produce the anagram OOF. So also would the sequence i i i o o o. You are to write a program to input pairs of words and output all the valid sequences of i and o which will produce the second member of each pair from the first.

Sample Input

madam
adamm
bahama
bahama
long
short
eric
rice

Sample Output

[
i i i i o o o i o o 
i i i i o o o o i o 
i i o i o i o i o o 
i i o i o i o o i o 
]
[
i o i i i o o i i o o o 
i o i i i o o o i o i o 
i o i o i o i i i o o o 
i o i o i o i o i o i o 
]
[
]
[
i i o i o i o o 
]

大概意思就是每两个输入为一组,第一个字符变换到第二个字符的堆栈结构变化一共有多少种可能。用'i','o'这样子的结构来表示。最后这多种结果用字典序排序后输出。

知识点是dfs,别往难的地方猜,你写暴力的dfs搜索就能过,至于Python的小细节,这里给出注意事项:

2.注意事项:

0.OJ平台

该题目的url:ZOJicon-default.png?t=M276https://zoj.pintia.cn/problem-sets/91827364500/problems/91827364503我是从2012年清化大学叫兽们出的书中看到的这道题目,原来给的链接已经没了,然后发现还好心给了提示,好多CSDN博客还在给那个链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004,看了看还是2014年的博客,害,古老的oj和远古的大佬,好吧好吧。

所以这里稍微提醒一下 这些题目已经转移到了 PTA 平台 中去了,搜拼题A,可以搜到,再找找ZOJ,就能找到了。(或者上边已经给了可用链接直接点也可以)

只有找到题目才能愉快地提交代码嘛,才能有进步。

1.无限流输入 、EOF输入流

C、C++可以使用while (scanf("%s",a)),或者while (cin>>a>>b),到文件末尾自动结束,但是我们Python的宝藏选手们可纠结了,你说牛客还支持放一个无限while挂着都没问题,这里的OJ你用正常读法会变成返回非零:Non Zero Exit Error。

因此给出正确写法:

while 1:#True 也行try:s1 = input()s2 = input()except EOFError:break

这样你才不会卡在第一个容易报错的地方。

2.返回中的空格

如果存的结果是"iioioo"直接输出的话,报错是:Presentation Error,原来是漏掉了空格。

那我写成:

' '.join('iioioo')

#输出应该是:i i o i o o

但是问题还是报错,一样的原因。

然后我就试着鼠标扫了一下空格,发现。。。。。。。这样还不行,最后面tmd还有空格,这不应该是各大平台已经极力禁止的操作了吗?算了算了,谅它还是个不成熟的OJ题目(毕竟挺早的了),原谅它吧。

正确应该写成:

' '.join('iioioo')+' ' 

如此,大功告成。

 3.AC代码

def dfs(s1,s2,index,ans_s):if len(s2) == len(target):#如果长度相同并且拼凑出了target字符,即s2 == target,答案数组增加s2这个答案字符if s2 == target:ans.append(ans_s)returnif index == len(s):#如果长度和 s 相同,要么代表栈里的s1没了,没有答案,要么继续把s1的字符一个一个弹出if s1 == '':returndfs(s1[:-1],s2+s1[-1],index,ans_s+'o')returnif s1 == '':#s1空了,但是还可以入栈的情况dfs(s1+s[index],s2,index+1,ans_s+'i')return#均不属于以上情况,存在两种操作:入栈或者弹出dfs(s1[:-1], s2 + s1[-1], index, ans_s + 'o')dfs(s1 + s[index], s2, index + 1, ans_s + 'i')
while 1:try:ans = []s = input()target = input()dfs('','',0,'')ans.sort()print('[')for i in ans:print(' '.join(i)+' ')print(']')#一定要EOFError判断,不然会挂except EOFError:break

 PS:

这里建议自己写一些,我的代码好乱,本来已经准备好优化一下的,结果一直看不是超时的原因就没改。而且貌似这题十分地单纯,DFS,并不是很难。

写的话我个人认为用字符存储结果能够省下很多空间了,而且模拟弹出栈元素十分方便(利用切片操作)。

优化的话比如每次len()一遍各个长度肯定费时的,有兴趣的兄弟可以在这里早早记录一下,之后调用就好了。


http://chatgpt.dhexx.cn/article/cY0HHFnp.shtml

相关文章

用Python统计字符串个数

1.题目 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 2.程序分析 利用while语句,条件为输入的字符不为’\n’. from pip._vendor.distlib.compat import raw_inputs raw_input(请输入字符串:\n) letters 0 space 0 digit 0 others …

PTA-MOOC《Python程序设计浙江大学》拼题题目集第一章编程题

7-1 从键盘输入两个数,求它们的和并输出 (30分) ****本题目要求读入2个整数A和B,然后输出它们的和。 输入格式: 在一行中给出一个被加数 在另一行中给出一个加数 输出格式: 在一行中输出和值。 输入样例: 在这里给出一组输入。例如: 输出样…

【Python】找出不是公共的元素

目录 找出不是公共的元素 代码思路仅供参考,欢迎大家批评指正! 找出不是公共的元素 给定两行输入,每行代表一组元素。每行的元素间用空格分开。求两组中非公共的元素。 # By jurio. a[i for i in input().split()] b[i for i in input().spl…

【PTA】【Python】【拼题A 2022 跨年挑战赛】小孩子才做选择,大人全都要

阿汪面前有两只盲盒,每只盒子打开都有两种可能:或者装了 X 克狗粮,或者是一只容量为 Y 克的狗粮储蓄盒。如果是狗粮,阿汪可以快乐地吃掉;如果是空储蓄盒,那就倒霉了,阿汪必须想办法找到狗粮把这…

【PTA】【Python】【拼题A 2022 跨年挑战赛】太神奇了

“告诉大家一个神奇的消息,太神奇了:明年全世界所有的人都同岁,全部都等于2022。明年的日子很特别,大概每1000年才会有一次。明年你的周岁年龄你的出生年,每个人都是2022年。例如:你明年57加上1965年生的&a…

LeetCode100题之—3、一汉明距离(python)

汉明距离 题目描述解题思路自己写的答案,不便捷1)利用循环2)利用右移别人给的高效答案 题目描述 解题思路 自己写的答案,不便捷 1)利用循环 分为两个步骤 主要求出两个数二进制形式上下对应时不相同的个数 1&#x…

PTA-MOOC《Python程序设计浙江大学》拼题A题目集第二章编程题

7-1 计算 111213…m (30分) 输入一个正整数m(20<m<100)&#xff0c;计算 111213…m 的值。 输入格式: 在一行输入一个正整数m。 输出格式: 在一行中按照格式“sum S”输出对应的和S. 输入样例: 在这里给出一组输入。例如&#xff1a; 输出样例: 在这里给出相应的输…

PTA-MOOC《Python程序设计浙江大学》拼题题目集第五章编程题题目及代码答案

7-1 输出星期名缩写 (70分) 输入一个1到7的数字&#xff0c;输出对应的星期名的缩写。 1 Mon 2 Tue 3 Wed 4 Thu 5 Fri 6 Sat 7 Sun 输入格式: 输入1到7之间数字 输出格式: 输出对应的星期名的缩写 输入样例: 在这里给出一组输入。例如&#xff1a; 1输出样例: 在这里给出…

菜鸟实战UML——类图

类图 类图(Class diagram)&#xff1a;是显示了模型的静态结构&#xff0c;特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分类的一般概念建模&#xff0c;也用于详细建模&…

记录一个IT菜鸟的成长之路。

会 的 真 的 会 的 所 有 离 开 的 人 都 信 誓 旦 旦 地 说 过 他 们 不 会 忘 记 曾 经 的 一 切 可 是 最 后 都 忘 了 无 一 例 外 地 忘 记 了 他 们 会 开 始 熟 悉 每 一 条 陌 生 的 路 听 每 一 首 陌 生 的 歌 会 知 道 在 哪 一 个 街 角 有 超 市 可 以 买…

SpringBoot使用菜鸟物流云打印电子面单

菜鸟物流云属于淘宝开放平台的一部分&#xff0c;淘宝开发平台提供了很多种对接接口&#xff0c;包括商品、销售单等等&#xff0c;几乎涉及到的业务都在该平台上开放了接口。 淘宝开放平台提供了两种快递面单接口&#xff0c;一种是淘宝商家TOP接口&#xff0c;一种是菜鸟物流…

菜鸟学设计模式——小单例有大秘密

欢迎大家关注我的新书《Spring Boot趣味实战课》 京东 当当 天猫 单例模式大家并不陌生&#xff0c;也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗&#xff1f;今天我带大家一起来看看我眼中的单例&#xff0c;可能会跟你的认识有所不同。 下面是…

项目菜鸟成长为老鸟之路

【背景】 从去年12月份开始加入廊坊市市委组织部考核系统的维护,到今天正式验收完重构文档,算是一个项目的完美阶段性结项。 维护工作(纯三层架构)——》重构阶段性完结(MVCWCFEF映射架构)&#xff0c;它经历了历史的变革。 项目菜鸟(刚入维护)——》中级老鸟(重构完结…

菜鸟驿站进军万亿社区市场

文&#xff5c;祝颖丽 编辑&#xff5c;斯问 “老板娘&#xff0c;取一下快递。”“取件码多少&#xff1f;” “老板娘&#xff0c;我的紫甘蓝到了吗&#xff1f;”“在后面货架上。” “老板娘&#xff0c;团购的东西总共多少钱&#xff1f;” “480。” 6月23日&#xff0c;…

《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

欢迎关注微信账号&#xff1a;java那些事&#xff1a;csh624366188.每天一篇java相关的文章 在众多朋友的支持和鼓励下&#xff0c;《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中&#xff0c;难…

“菜鸟”程序员和“大神”程序员差距在哪里

点击上方“程序员大咖”&#xff0c;选择“置顶公众号” 关键时刻&#xff0c;第一时间送达&#xff01; 刚刚走出就业的程序员&#xff0c;技术是刚刚起步的基点。那下面我们就聊一聊有关技术的东西。首先请您先想想这几个问题。现在社会上有很多程序员&#xff0c;那您是否可…

Java程序员从笨鸟到菜鸟全部博客目录

本文来自&#xff1a;曹胜欢博客专栏。转载请注明出处&#xff1a;http://blog.csdn.net/csh624366188 欢迎关注微信账号&#xff1a;java那些事&#xff1a;csh624366188.每天一篇java相关的文章 大学上了一年半&#xff0c;接触java也一年半了&#xff0c;虽然中间也有其他东…

html 菜鸟驿站,菜鸟驿站

项目背景 菜鸟驿站是由阿里巴巴旗下菜鸟网络牵头&#xff0c;建立的面向社区、校园的第三方末端物流服务平台。在服务物流行业的同时&#xff0c;持续提升末端运作效率&#xff0c;并为用户提供包裹暂存、代寄等服务&#xff0c;致力于为消费者提供多元化的最后一公里服务。 菜…

cai鸟驿站管理系统

cai鸟驿站管理系统 需求&#xff1a;要求实现登陆&#xff0c;完成管理员对员工的管理&#xff0c;以及员工对订单的管理。如果登陆成功。根据登陆用户的权限&#xff0c;进入不同的界面。如果用户以管理员身份登陆系统&#xff0c;则进入管理员管理员工的界面。 功能&#xf…

软件测试——文档测试

从三月份进入公司实习&#xff0c;眨眼间已是七月中了&#xff0c;研一的下半学期恍惚间就结束了。 从前对软件测试的认知局限于黑盒测试、白盒测试&#xff0c;进入公司才知道我所了解的只是“冰山一角”。上个月参与了一个项目&#xff0c;花费了一周左右的时间——对文档。这…