首页 > 试题广场 >

判断是不是子字符串

[编程题]判断是不是子字符串
  • 热度指数:5172 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个字符串 s t ,判断 s是否为 t 的子序列。

你可以认为 s t 中仅包含英文小写字母。字符串 t 可能会很长(长度n ~= 500,000),而 s 是个短字符串(长度 <=100)。

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

进阶:时间复杂度,空间复杂度

输入描述:

共两行,第一行为字符串s,  第二行为字符串t

字符串t的长度 1<=n<=500000

字符串s的长度 1<=m<=100



输出描述:
输出true或者是false,true表示是s是t的子序列,false表示s不是t的子序列
示例1

输入

abc
ahbgdc

输出

true
示例2

输入

axc
ahbgdc

输出

false
var boolen = function(str1,str2) {
  if (str1.length > str2.length) {
    return false
  }
  var first = str1.split('')[0]
  for (let a = 0; a <= str2.length; a++) {
    if (str2[a] === first) {
      if (str1.length > 0) {
        var strNew1 = str1.slice(1)
        var strNew2 = str2.slice(a)
        return boolen(strNew1,strNew2)
      } else {
        return true
      }
    }
  }
  return false
} 

发表于 2021-03-16 15:15:40 回复(0)

js解法:正则表达式

let _lines=[];
while(line=readline()){
    _lines.push(line);
}
let _str=_lines[0].split('').join('[a-z]*')
console.log(new RegExp(_str).test(_lines[1]));
发表于 2021-02-22 14:12:24 回复(0)
let s = readline();
let t = readline();
function a(s,t){
    let count = 0;
    for(var i = 0;i < s.length;i++){
        for(var j = 0;j < t.length;j++){
            if(s[i] === t[j]){
                count++;
                i++;
            }
        }
    }
    return count >= s.length;
}
print(a(s,t));


发表于 2021-03-27 14:31:33 回复(1)

function decide(str1, str2) {
  str2 = str2.split('')
  str1 = str1.split('')
  if (str2.length < str1.length) return false;
  let num = str1.length
  let first = str1.shift()
  let counter = 0
  for (let i = 0; i < str2.length; i++) {
    if (first === str2[i]) {
      counter++;
      first = str1.shift()

    }
  }
  return num === counter
}

发表于 2021-03-22 11:18:33 回复(0)
//Java 屎山?
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String child = in.nextLine();
        String father = in.nextLine();
        
        int count = 0;
        int index = 0;
        for (int i = 0;i<child.length();i++) {
            if (father.substring(index).contains(child.substring(i,i+1))){
                index += father.substring(index).indexOf(child.substring(i, i + 1));
                count++;
            }else{
                break;
            }
        }
        System.out.println(count == child.length());
    }
}

编辑于 2023-02-09 01:33:47 回复(0)
s = str(input())
t = str(input())

s_len = len(s)
t_len = len(t)
ne = 0
count = 0
for i in range(s_len):
    for j in range(ne,t_len):
        if t[j] == s[i]:
            
            ne += 1
            count += 1
            break
        else:
            ne += 1

if count == s_len:
    print('true')
else:
    print('false')
            

发表于 2022-07-02 09:40:26 回复(0)
#include<iostream>

using namespace std;
bool help(string s, string t, int l1, int l2){
    if(l1 >= s.length()) return true;
    if(l2 >= t.length()) return false;
    if(s[l1] == t[l2]) return help(s, t, l1 + 1,l2 + 1); 
    else  return help(s, t, l1,l2 + 1);
}
int main(){
    string s,t;
    cin >> s >> t;
    if(help(s, t, 0, 0)) cout << "true";
    else cout << "false";
}
发表于 2022-04-15 13:00:30 回复(0)
def s_isT(s, t):
    n = len(s)
    m = len(t)
    if n > m: 
        return 'false'
    p1 = p2 = 0
    res = ""
    while p1 < n and p2 < m:
        if s[p1] == t[p2]:
            res += s[p1]
            p1 += 1
            p2 += 1
        else:
            p2 += 1
    if res == s: 
        return 'true'
    else: 
        return 'false'
            
while True:
    try:
        s = input()
        t = input()
        print(s_isT(s, t))
    except:
        break

发表于 2021-08-30 14:57:46 回复(0)
短的字符串和长的字符串进行比较,如果相等,两个都接着比较下一个,如果不等,长的移动到下一个,短的指针停留在原位置,直到遇到再次相等短的再动,一次遍历是从短的第一个开始,二此遍历从短的第二个开始,直到短的每个字母作为起始遍历完,才算结束。
发表于 2021-08-20 11:12:26 回复(0)
### java双指针
# 思路:指定两个指针p1和p2,指向s与t的初始位置。判断s与t在位置p1和p2是否相等,若相等,则p1++、p2++,否则,p2++,直到p1指向s最后一个或是p2指向t的最后一个元素为止,最后,判断p1是否与s的长度相等
  1. # 获取输入,并定义两个指向s与t的初始位置的指针p1、p2
  2. 判断s与t在p1 p2位置的元素是否相等,若相等,则p1++  p2++;否则p2++
  3. 返回p1是否与s的长度相等的判断
Scanner in = new Scanner(System.in)
while(in.hasNextLine()){
    String a = in.nextLine();
    String b = in.nextLine();
    int p1 = 0;
    int p2 = 0;
    int s = a.length();
    int t = b.lenght();
    while(p1 < s && p2 < t){
    if (a.charAt(p1) == b.charAt(p2)){
        p1++;
    }
    p2++;
}
    System.out.println(p1==s)
}
发表于 2023-09-14 11:43:02 回复(0)
class Solution:
    def isSon(self, s: str, m: str) -> bool:
        # 先将字符串列表化
        s_ls = list(s)
#        print(s_ls)
        m_ls = list(m)
#        print(m_ls)
        # 设置结果变量flag
        flag = False
        # index用来记录上一次匹配成功的元素的位置
        index = 0
        # 外循环是变化慢的s_ls 内循环是变化快的m_ls
        for i,val1 in enumerate(s_ls):
            for j,val2 in enumerate(m_ls):
                # 若在m_ls中找到了s_ls的元素并且该元素的位置在上一个匹配上的元素的后面
                if val1 == val2 and j >= index:
                    # 更新index,结果设置为true
                    index = j
                    flag = True
                    break
                else:
                    flag = False
            # 若遍历完m_ls都没有找到与s_ls的元素相等的元素,说明s_ls not in m_ls,那就直接结束整个循环,返回false
            if flag == False:
                break
        print(str(flag).lower())


solution = Solution()
solution.isSon('hgb', 'ahbgdc')

发表于 2023-07-11 10:34:44 回复(0)
在父串中组合子串
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("input zi chuan");
        String childrenString = input.next();

        System.out.println("input fu chuan");
        String superString = input.next();

        System.out.println(panduan(childrenString,superString));
    }

    public static boolean panduan(String zc, String fc){
        String s = fc;
        for(int i =0 ; i < zc.length();i++){
            char ch = zc.charAt(i);
            //在父串中组合子串
            s = s.substring(s.indexOf(ch));
            if(s.indexOf(ch) == -1 )
                return false;
            }
        return true;
        }
}

发表于 2022-09-01 16:20:33 回复(1)
进阶:时间复杂度O(n) ,n=t.length;空间复杂度O(n)
import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String t = sc.nextLine();
            String s = sc.nextLine();
            int fromIndex = 0;
            boolean flag = true;
            for (int i = 0; i < t.length(); i++) {
                int tmp = s.indexOf(t.charAt(i), fromIndex);
                if (tmp < 0) {
                    flag = false;
                    break;
                }
                fromIndex = tmp;
//                s = s.substring(tmp);

            }
            System.out.println(flag);
        }
    }
    
}





编辑于 2022-04-27 00:38:52 回复(1)
const s = readline()
let t = readline()
let flag = true

for (let i = 0; i< s.length;i++){
    if(t.indexOf(s[i]) ===  -1){
        flag = false
        console.log(false)
        break;
    }else{
       t = t.slice(t.indexOf(s[i]) + 1)
    }
}
if(flag) console.log(true)

发表于 2021-08-30 21:37:31 回复(0)
根据上面老哥的提示双指针做的,跑了几个用例没问题,有问题请指教
import java.util.Scanner;

public class Main21 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String t = sc.nextLine();
        String s = sc.nextLine();
        int p1=0;
        int p2=0;
        for(int i=0;i<t.length();i++){
            if(t.charAt(p1)==s.charAt(p2)){
                p1++;
                p2++;
            }else if(t.charAt(p1) != s.charAt(p2)) p1++;
            if(p1>t.length()||p2>s.length()){
                break;
            }
        }

        System.out.println(p2>s.length()-1);
    }
}


发表于 2024-04-16 18:27:34 回复(0)
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);  // 注意 hasNext  hasNextLine 的区别  while (in.hasNextLine()) { // 注意 while 处理多个 case  String s = in.nextLine();  String t = in.nextLine();  int sIndex = 0;  int tIndex = 0;  for (;tIndex < t.length() && sIndex < s.length(); tIndex++) { if (t.charAt(tIndex) == s.charAt(sIndex)) {
                sIndex++;  }
        }
        System.out.println(sIndex == s.length());  }
}

发表于 2024-03-25 23:06:44 回复(0)

类似消消乐,将子串消除即可
import Foundation

while let line = readLine() {
    let subArray = Array(line)
    var supArray = Array(readLine()!)
    var index = 0
    var flag = false

    for i in 0..<supArray.count {
       if supArray[i] == subArray[index] {
        index += 1
       }
        if index == subArray.count {
            flag = true
            break
        } 

    }

  
    print(flag)

    // let parts = line.split(separator: " ")
    // print(Int(parts[0])! + Int(parts[1])!)
}

编辑于 2024-03-12 20:05:44 回复(0)
class Solution:
    def isSubseq(self, s: str, t: str) -> bool:
        n = 0
        for i in s:
            for j in range(n, len(t)):
                if i == t[j]:
                    n = j + 1
                    break
            else:
                return False
        return True


s = 'axc'
t = 'ahbgdc'
print(Solution().isSubseq(s, t))

编辑于 2024-03-10 22:10:05 回复(0)
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    const lineArr = [];
    while ((line = await readline())) {
        lineArr.push(line);
    }


    const tempArr = [];
    const sArr = lineArr[0].split("");
    const tArr = lineArr[1].split("");
    let start = 0
    for(let i = 0; i < sArr.length; i++) {
        for(start; start < tArr.length; start++) {
            if(tArr[start] === sArr[i]) {
                tempArr.push(tArr[start])
                break
            }
        }
    }

    

    if (tempArr.join("") === lineArr[0]) {
        console.log(true);
    } else {
        console.log(false);
    }
})();

发表于 2024-03-10 14:30:48 回复(0)
我觉得时间复杂度是O(n)
import sys

a_line = next(sys.stdin)
b_line = next(sys.stdin)
start = 0
end = len(a_line) - 1
for i in b_line:
    if i == a_line[start]:
        start += 1
    if start == end:
        break
if start == end:
    print("true")
else:
    print("false")



编辑于 2024-03-07 13:19:01 回复(0)