二分删字符串

原题String Game

题意

给字符串a,b,给出删a中字符串的顺序,求最多删多少次后,b还是a是子序列

解析

一个一个删就T了,所以二分一下删的个数

代码

string a,b;
int s[200009];
int sub[200009];

int judge(int t){
    mmm(sub,0);for1(i,1,t)sub[s[i]]=1;
    int ai=0,bi=0;
    for(;ai<a.length();ai++){
        if(sub[ai+1])continue;
        if(a[ai]==b[bi])bi++;if(bi==b.length())return 1;
    }
    return 0;
}

int main(){
    cin>>a>>b;
    for1(i,1,a.length()){
        scanf("%d",&s[i]);
    }

    int l=0,r=a.length(),mid;
    while(r-l>1){
        mid=r+l>>1;
        if(judge(mid))l=mid;
        else r=mid;
    }
    printf("%d\n",l);
}
<think>好的,我现在需要帮助用户了解JavaScript中字符串的操作方法。首先,用户已经提供了两个引用内容,我需要根据这些内容来组织答案,同时遵守系统级指令中的格式要求。 首先,我应该回忆一下JavaScript字符串的基本操作,比如创建、访问、修改等。根据引用[1]和[2],字符串是不可变的,所以任何操作都会返回新字符串。需要提到这一点,因为用户可能不知道为什么有些方法不会改变原字符串。 接下来,我需要分步骤讲解,比如创建字符串、基本操作(增改查),以及转换和查询方法。例如,concat方法用于增加字符串,slice、substring、substr用于截取,padStart/padEnd用于填充,trim用于除空白字符,toUpperCase/toLowerCase用于转换大小写,indexOf/includes/startsWith/endsWith用于查询。 还要注意用户可能需要示例代码,所以每个方法都需要提供一个简短的例子,用反引号包裹代码块。同时,行内变量如string需要用$符号包裹,比如$str$。 另外,用户提到了生成相关问题,所以最后要添加几个相关问题,比如不可变性的影响,常用方法比较,实际应用场景等。这些问题需要与字符串操作相关,并且能引导用户进一步学习。 需要确保所有的LaTeX格式正确,比如变量用$...$,独立公式用$$...$$,但这里可能用不上独立公式,所以主要关注变量和代码块。同时,引用标识要放在相关段落的末尾,如[^1]或[^2]。 最后,检查结构是否清晰,是否覆盖了用户的需求,是否引用了正确的资料,并确保没有使用任何Markdown格式,只用纯文本和规定的格式。</think>以下为JavaScript字符串操作的详细教程,涵盖基本操作、常用方法及实例演示: ### 一、字符串创建 1. **字面量创建** ```javascript let str1 = 'Hello'; // 单引号 let str2 = "World"; // 双引号 let str3 = `模板字符串`; // 反引号(支持插值表达式) ``` 2. **构造函数创建** ```javascript let str4 = new String('JavaScript'); // 返回String对象 ``` ### 二、字符串操作方法 #### 1. 增:拼接字符串 - **`concat()`方法** ```javascript let result = 'Hello'.concat(' ', 'World'); // 输出"Hello World" ``` - **模板字符串** ```javascript let name = 'Alice'; let greeting = `Hello, ${name}!`; // 输出"Hello, Alice!" ``` #### 2. :截取子字符串 - **`slice(start, end)`** 截取从$start$到$end-1$的字符(支持负数索引): ```javascript 'JavaScript'.slice(4,7); // 输出"Scr" ``` - **`substring(start, end)`** 类似`slice`,但自动处理负数为0: ```javascript 'JavaScript'.substring(-3, 4); // 输出"Java" ``` #### 3. 改:修改字符串内容 - **填充** `padStart(length, padStr)`和`padEnd(length, padStr)`: ```javascript '5'.padStart(3, '0'); // 输出"005" ``` - **替换** `replace(searchVal, newVal)`: ```javascript 'Hello World'.replace('World', 'JS'); // 输出"Hello JS" ``` #### 4. 查:查找与验证 - **`indexOf(searchStr)`** 返回首次出现的位置,未找到返回$-1$: ```javascript 'JavaScript'.indexOf('Script'); // 返回4 ``` - **`includes(searchStr)`** 返回布尔值: ```javascript 'Hello'.includes('ell'); // 返回true [^2] ``` ### 三、字符串转换 - **大小写转换** ```javascript 'Hello'.toUpperCase(); // 输出"HELLO" 'WORLD'.toLowerCase(); // 输出"world" ``` - **数字转换** ```javascript parseInt('123px'); // 返回123 ``` ### 四、特殊处理技巧 - **除空白字符** ```javascript ' text '.trim(); // 输出"text" ' text '.trimStart(); // 输出"text " ``` - **字符遍历** ```javascript for (let char of 'JS') { console.log(char); // 依次输出'J'、'S' } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值