每日一题(一) 7.27


每日一题 7.27

给定字符串 st ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

示例 1:
s = “abc”, t = “ahbgdc”

返回 true.

示例 2:
s = “axc”, t = “ahbgdc”

返回 false.

思路:

​ 我们初始化两个指针 i 和 j ,分别指向 s 和 t 的初始位置。每次贪心地匹配,匹配成功则 i 和 j 同时右移,匹配 s 的下一个位置,匹配失败则 j 右移,i 不变,尝试用 t 的下一个字符匹配 s。
​ 最终如果 i 移动到 s的末尾,就说明 s 是 t 的子序列。

代码:
#include <stdio.h> 
#include <string.h>//字符串所需包
#include <stdbool.h>//bool所需包

bool isSubsequence(char *s, char *t) {    
    int n = strlen(s), m = strlen(t);    
    int i = 0, j = 0;//定义两个指针
    while (i < n && j < m) {        
        if (s[i] == t[j]) {            
            i++;        
        }        
        j++;    
    }    
    printf("%d",i==n);//%d指十进制数字
}

int main() {    
    isSubsequence("abcdc", "asdabcd");
}
复杂度分析:
  • 时间复杂度:O(m + n)
  • 空间复杂度:O(1)

文章作者: 小冷同学
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小冷同学 !
用户交流区

温馨提示: 遵纪守法, 友善评论!