LC-交织的字符串

交织的字符串

//交织的字符串
/*给出三个字符串s1, s2, s3,判断s3是否可以由s1和s2交织而成。
例如:
给定
s1 ="xxyzz",
s2 ="pyyzx",
如果s3 ="xxpyyzyzxz", 返回true
如果s3 ="xxpyyyxzzz", 返回false*/
#include<string>
#include<vector>
#include<deque>
using namespace std;
class Solution {
public:
	/*
	  设dp[i][j]表示s3的前i+j个字符可以由s1的前i个字符和s2的前j个字符交织而成。
	  状态转移方程:
	  1)dp[i][j]= (dp[i - 1][j] && s1(i - 1) == s3(i + j - 1)
	  dp[i-1][j]表示若s3的前i+j-1个字符能够由s1前i-1个字符和s2的前j个字符交织而成,
	  那么只需要s1的第i个字符与s3的第i+j个字符相等(s1索引从0开始),那么dp[i][j]=true;
	  2)dp[i][j]= (dp[i][j-1] && s2(j - 1) == s3(i + j - 1)
	  dp[i-1][j]表示若s3的前i+j-1个字符能够由s1前i个字符和s2的前j-1个字符交织而成,
	  那么只需要s2的第j个字符与s3的第i+j个字符相等(s2索引从0开始),那么dp[i][j]=true;
	  */
	bool isInterleave(string s1, string s2, string s3) {
		int s1Length = s1.length();
		int s2Length = s2.length();
		int s3Length = s3.length();
		if (s1Length + s2Length != s3Length)
			return false;
		vector<vector<int>> dp(s1Length + 1, vector<int>(s2Length + 1, 0));  //dp[0][0]为不选字符,因此vector要放入所有的s1、s2字符需要的长度+1
		dp[0][0] = 1;
		for (int i = 1; i <= s1Length; ++i)            
		{
			dp[i][0] = dp[i - 1][0] && (s1[i - 1] == s3[i - 1]);
		}
		for (int j = 1; j <= s2Length; ++j)
		{
			dp[0][j] = dp[0][j - 1] && (s2[j - 1] == s3[j - 1]);
		}
		for (int i = 1; i <= s1Length; ++i)
		{
			for (int j = 1; j <= s2Length; ++j)
			{
				dp[i][j] = (dp[i - 1][j] && (s1[i - 1] == s3[i + j - 1]))
					|| (dp[i][j - 1] && (s2[j - 1] == s3[i + j - 1]));
			}
		}
		return dp[s1Length][s2Length];
	}
};
要在LC-3上输出一个字符串,可以使用循环来逐个输出字符串中的字符,直到遇到字符串的终止符号(通常是空字符'\0')。可以使用TRAP指令调用操作系统提供的输出函数PUTC来输出字符。 以下是一个输出字符串的示例程序: ``` ; 输出字符串 LEA R0, MESSAGE ; 将消息字符串的地址加载到R0中 LOOP: LDR R1, R0, #0 ; 从地址R0处读取一个字符到R1中 BRz DONE ; 如果字符为0,则跳转到DONE PUTC ; 输出字符 ADD R0, R0, #1 ; R0加1,指向下一个字符 BR LOOP ; 继续循环输出字符 DONE: RET ; 返回 MESSAGE .STRINGZ "Hello, World!" ; 消息字符串 ``` 要在LC-3上输入一个字符串,可以使用循环来逐个读取输入的字符,直到遇到输入的终止符号(通常是回车符'\r')。可以使用TRAP指令调用操作系统提供的输入函数GETC来读取字符。 以下是一个输入字符串的示例程序: ``` ; 输入字符串 LEA R0, BUFFER ; 将缓冲区的地址加载到R0中 AND R1, R1, #0 ; R1清零,用于记录输入的字符数 LOOP: GETC ; 读取一个字符 OUT ; 将字符输出到控制台 ST R0, R1, #0 ; 将字符存储到缓冲区 ADD R1, R1, #1 ; R1加1,记录输入的字符数 ADD R0, R0, #1 ; R0加1,指向下一个存储位置 BRnzp LOOP ; 如果字符不为0,则继续循环输入 STR R1, R0, #0 ; 将字符数存储到缓冲区的末尾 RET ; 返回 BUFFER .BLKW 80 ; 缓冲区,最多可以存储80个字符 ``` 在这个例子中,我们使用一个缓冲区来存储输入的字符串,并在输入结束后将字符串的长度存储在缓冲区的末尾。要输出和输入字符串,可以将这两个例子结合起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值