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开始匹配。