从物理学到计算机,再到硬件,再到人工智能!
蓝桥杯备赛 (LintCode上刷的第十二题)
问题描述
给定字符串s和t,判断s是否为t的子序列。
你可以认为在s和t中都只包含小写字母。t可能是一个非常长(length ~= 500,000)的字符串,而s是一个较短的字符串(length <= 100)。
一个字符串的子序列是在原字符串中删去一些字符(也可以不删除)后,不改变剩余字符的相对位置形成的新字符串(例如,"ace"是"abcde"的子序列而"aec"不是)。
样例输出
样例1:
s = “abc”,t = “ahbgdc”
返回true。
样例2:
s = “axc”,t = “ahbgdc”
返回false。
问题分析
没有采用动态规划的思想,直接遍历一次原字符串t。遍历到s的最后一个字符时,返回true;若遍历到原字符串t的最后一个字符都没能遍历到s的最后一个字符串,返回false。
JAVA代码实现
package DP;
public class isSubsequence1263_1113 {
/**
* 判断s是否为t的子序列
* @param s 需要判断的字符串
* @param t 原字符串
* @return
*/
public static boolean isSubsequence(String s, String t) {
// 将字符串全部转换成字符数组
char[] sc = s.toCharArray();
char[] tc = t.toCharArray();
boolean flag = false;
// 创建一个变量记录sc数组的下标
int m = 0;
//遍历原字符串tc的每一个元素
for (int i = 0; i < tc.length; i++) {
//当sc的元素与tc的元素相等时
if (sc[m] == tc[i]) {
//记录sc数组下标的元素后移
m ++;
}
//当m移动到sc的最后一个元素,跳出循环
if (m == sc.length - 1) {
flag = true;
break;
}
}
return flag;
}
public static void main(String[] args) {
String s = "abc", t = "ahbgdc";
boolean flag = isSubsequence(s, t);
System.out.println(flag);
}
}