英雄会之交替字符串

本文探讨了如何通过编程实现交替字符串的验证,深入解析数据结构和算法的应用,涉及字符串操作、循环和条件判断等核心概念,旨在提升读者在解决实际问题时的数据结构与算法思维。

英雄会之交替字符串

个人信息:就读于燕大本科软件工程专业 目前大三;

本人博客:百度搜索“cqs_2012”即可;

个人爱好:酷爱数据结构和算法,希望将来搞科研为人民作出自己的贡献;

博客内容:英雄会之交替字符串;

博客时间:2014-3-26

  • 引言

做题目不是为了得奖,为了历练自己。

  • 题目

题目详情

如果字符串str3能够由str1和str2中的字符按顺序交替形成,那么称str3为str1和str2的交替字符串。例如str1="abc",str2="def",那么"adbecf", "abcdef", "abdecf", "abcdef", "adefbc"等等都为str1和str2的交替字符串。更形式化的,str3的生成算法如下:

str3=""

while str1不为空 or str2不为空:

 把str1或str2的首字符加入到str3,并从str1或str2中删除相应的字符

end

给定str1, str2,和str3,判断str3是否为str1和str2的交替字符串。


输入格式:

多组数据,每组数据三行,分别是str1,str2,str3。str1,str2的长度在[1..100]范围内,str3的范围在[1..200]范围内。字符串只包含小写英文字母。

输出格式:

每组数据输出一行YES或者NO。

  • 思路

个人认为这道题很简单,但是需要考虑各种细节;

  1. str1,str2的长度在[1..100]范围内
  2. str3的范围在[1..200]范围内
  3. 符串只包含小写英文字母

个人思路如下(突然发现博客上传照片不能显示了,痛。。。)

// function: test for problem
bool Str3_for_Str1andStr2(string str1,string str2,string str3)
{
	if( str1.length()>0 && str2.length()>0 && str3.length()>0 && str3.length() == str1.length() + str2.length() )
	{
		size_t m1=0,m2=0,m3=0;
		while(m3 < str3.length())
		{
			if( str3[m3] == str1[m1] )
			{
				m3++;
				m1++;
			}
			else if( str3[m3] == str2[m2] )
			{
				m3++;
				m2++;				
			}
			else return false ;
		}
		return true ;
	}
	else
	{
		cout<<"exception of function Str3_for_Str1andStr2 input"<<endl;
		return false;
	}
}


  • 实验

今天不知道咋了,突然发现程序截图不能上传了,痛呀。。。

结果文本如下


asfsdfsdf
sfs
asdfsdfasfas
0
aab
bba
bbaaab
1
aaa
bbb
baabba
1

  • 代码

test.cpp

// include: head file
#include<iostream>
#include<string>
using namespace std;


// function: test for problem
bool Str3_for_Str1andStr2(string str1,string str2,string str3);

// function: main
int main()
{
	string str1,str2,str3;
	while(cin>>str1>>str2>>str3)
		cout<<Str3_for_Str1andStr2(str1,str2,str3)<<endl;
	system("pause");
	return 0;
}

// function: test for problem
bool Str3_for_Str1andStr2(string str1,string str2,string str3)
{
	if( str1.length()>0 && str2.length()>0 && str3.length()>0 && str3.length() == str1.length() + str2.length() )
	{
		size_t m1=0,m2=0,m3=0;
		while(m3 < str3.length())
		{
			if( str3[m3] == str1[m1] )
			{
				m3++;
				m1++;
			}
			else if( str3[m3] == str2[m2] )
			{
				m3++;
				m2++;				
			}
			else return false ;
		}
		return true ;
	}
	else
	{
		cout<<"exception of function Str3_for_Str1andStr2 input"<<endl;
		return false;
	}
}


 

 

任务 2a [5 分] 创建一个名为 Book 的类,用于表示英雄可以阅读以学习新技能的书籍的属性。这些属性应包括: 书名(字符串类型); 作者(字符串类型); 页数(整数类型);以及 要学习的技能(使用 Skill 枚举类型表示)。 你的 Book 类应该有一个构造函数来设置所有字段,以及所有属性的 getter 方法。你还应该重写 equals 方法,以便在书名和作者相同时,两本书被视为相等。你不需要对书籍属性进行任何错误检查,也不需要实现 setter 方法。 此外,还要在 Hero 类中添加一个方法,其签名和行为如下: public void readBook (Book book) 此方法应将英雄的当前技能更新为书中提供的技能,并在 System.out 中打印消息“<HeroName> 已阅读 &#39;<Title>&#39;,现在知道:<Skill>”。 任务 2b [2 分] 定义一个名为 Library 的类,用于存储书籍集合。该集合初始为空。 在 Library 类中添加一个方法,其签名和行为如下: public void addBook (Book book) 此方法应将指定的书籍添加到集合中。无需检查重复项,集合中存在同一本书的多个副本是可以接受的。 任务 2c [4 分] 在 Library 类中添加一个方法,其签名和行为如下: public boolean removeBook (Book book) 此方法应在集合中查找与输入参数匹配的书籍(使用 equals() 方法)。如果找到匹配的书籍,则将其从集合中移除并返回 true。如果没有找到匹配的书籍,则不执行任何操作并返回 false。 任务 2d [4 分] 向你的 Library 类添加一个方法,其签名和行为如下: public boolean assignBestSkillBook(Hero hero, Skill desiredSkill) 如果英雄已经掌握了所需的技能,则此方法应返回 false 且不做任何更改。 否则,此方法应在图书馆中查找所有提供所需技能的书籍——如果不存在这样的书籍,则该方法应返回 false 且不做任何更改。 否则,它应搜索所有提供所需技能的书籍,并选择页数最少的书籍。使用选定的书籍: 使用选定的书籍调用 Hero.read() 方法 使用 Library.removeBook() 方法将其从图书馆中移除 返回 true Java 任务 3:敌人和战斗 [总分 15 分] 你将实现一个简单的类来表示敌人,以及一个 BattleArena 类,用于运行英雄和敌人之间的回合制交替战斗。 任务 3a [4 分] 创建一个名为 Enemy 的类来表示视频游戏中敌人的基本信息。敌人应该具有名称和生命值属性,其行为应与上述英雄的属性相同,并且你应该为这两个属性定义 getter 和 setter 方法,并像英雄一样进行验证。 任务 3b [5 分] 在你的 Hero 类和 Enemy 类中定义一个 attack 方法,其签名和行为如下: public void Hero.attack(Enemy enemy) 此方法应根据英雄的当前技能值减少给定敌人的生命值。确保敌人的生命值永远不会低于零。 无:减少 1 剑术:减少 3 火球:减少 4 public void Enemy.attack (Hero hero) 此方法应在每次敌人攻击时将英雄的生命值减少 2。确保英雄的生命值永远不会低于零。 任务 3c [6 分] 实现一个名为 BattleArena 的类,其中包含一个静态方法,该方法具有以下签名和行为: public static boolean fightToTheEnd (Hero hero, Enemy enemy) 此方法应循环执行,直到英雄或敌人被击败(即生命值降至 0)。英雄应先攻击(使用上述 attack 方法),然后敌人攻击,如此循环,直到一方被击败。每次英雄或敌人攻击后,都应检查是否被击败。如果英雄获胜(即敌人被击败),则此方法的返回值应为 true;如果敌人获胜,则返回值应为 false。缺失的文件题目中有对其的描述 严格按照题目中给出的示例的名称 变量名称 要求 参数 属性 变量 函数 方法生成
最新发布
12-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值