2020.7.27 力扣每日

 1 class Solution {
 2     public boolean isSubsequence(String s, String t) {
 3         int len1 = s.length(), len2 = t.length();
 4         int indexs = 0, indext = 0;
 5         while (indext < len2 && indexs < len1 ) {
 6             if (s.charAt(indexs) == t.charAt(indext)) {
 7                 indexs++;
 8             }
 9             indext++;
10         }
11         return indexs == len1;
12     }
13 }

解题思路:

   题目要求匹配字符串的子序列,对于两条字符串的匹配操作,一般都可使用双指针的方法来解决。此处也是如此,观察题目,我们不难发现可以设计两个index指针,来指向字符串的开头。当两者匹配成功时,同时移动指针,来匹配下一个字符;当匹配不成功时,仅移动t字符串中的指针,最后判断s字符串中指针是否指向字符串尾部即可。

注意点:

   由于有双指针,使用while将两个指针的位置作为循环判断条件较好。且无论匹配是否成功indext都必须移动

时间复杂度:O(M+N),m,n为字符串长度

空间复杂度:O(1)

优化:

   在提交测试时,发现此解法并非最优解法,可以使用java中string类的内置方法,indexOf进行优化。

 1 class Solution {
 2     public boolean isSubsequence(String s, String t) {
 3         int index = -1;
 4         for (char c : s.toCharArray()) {
 5             index = t.indexOf(c, index + 1);
 6             if (index == -1) {
 7                 return false;
 8             }
 9         }
10         return true;
11     }
12 }

注意点:

   每次使用indexOf找到对应位置后,寻找下一个字符时应对index进行+1操作,来达到匹配后续字符的目的。因此index初值需设置为-1,使第一次从0开始匹配。

猜你喜欢

转载自www.cnblogs.com/-TTY/p/13388305.html