letcode 3 【随记letcode编程史】
================================================
判断子序列(392)
问题:给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
示例 1: s = “abc”, t = “ahbgdc”。返回 true.
示例 2: s = “axc”, t = “ahbgdc”。返回 false.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/is-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
================================================
主体思想:通过将输入的字符串作比较,通过两个for循环判断是否为子序列。首先,第一个for循环取出待判断子序列s的字符,然后第二个for循环取出序列t的字符,并进行比较,如果相同,就进行count累加,并对序列t进行更新,并最后跳出该次循环。
因为每进行一次比较,第二个for循环都会默认从头开始,这样便会误判。(例如会把"aec"判断成是"abcde"的一个子序列),所以当比较相等时,就要把已经比较过字符串去除。这样便可以保证误判的情况出现。
================================================
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String t = sc.nextLine();
isSubsequence(s, t);
}
public static boolean isSubsequence(String s, String t) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
char str = s.charAt(i);
for (int j = 0; j < t.length(); j++) {
if (str == t.charAt(j)) {
count++;
t = t.substring(j+1, t.length());
System.out.println(t);
break;
}
}
}
if (count == s.length()) {
System.out.println("True");
} else {
System.out.println("Fasle");
}
return false;
}
}
运行结果如图:
【额外拓展】
break与continue的区别:
break:
(1).结束当前整个循环,执行当前循环下边的语句。忽略循环体中任何其它语句和循环条件测试。
(2).只能跳出一层循环,当使用的循环是嵌套循环,可以使用break逐层跳出。
continue:
(1).结束当前循环,进行下一次的循环判断。
(2).终止当前的循环过程,但他并不跳出循环,而是继续往下判断循环.它只能结束循环中的一次过程,不能终止循环继续进行。