2 条题解

  • 0
    @ 2025-10-13 20:16:18

    捣蛋鬼别捣蛋

    顶级智斗,其实就是按顺序在所给串里依次匹配目标串的每个字符,只要匹配完最后一个字符便可直接结束遍历,反之则无法成功匹配。做得我冷汗直冒

    参考代码(python)

    from sys import stdin
    
    s=list(stdin.readline().rstrip())
    goal=list('swiper')
    begin=-1
    idx=0
    for i in range(len(s)):
        if s[i]==goal[idx]:
            idx+=1
            if idx==1:
                begin=i+1
            if idx==6:
                break
    if idx==6:
        print(begin)
    else:
        print(-1)
    
    
    • 0

      捣蛋鬼别捣蛋

      我们要在一个字符串 s 中判断是否存在单词 "swiper"子序列(即可以不连续,但顺序要保持)。 一旦找到 "swiper" 的完整序列,就输出其中第一个字母 's' 的位置(从 1 开始计数); 如果整篇游记中都无法找到完整的 "swiper",则输出 -1

      换句话说,我们要在字符串 s 中寻找一个满足顺序的匹配:

      s → w → i → p → e → r
      

      但中间允许夹杂任意其他字符。


      题目本质是 子序列匹配 问题。

      我们可以用两个指针来做:

      • 指针 i:遍历游记字符串 s
      • 指针 j:匹配 "swiper" 当前需要的字母。

      算法逻辑如下:

      1. 初始 j = 0(要找 "swiper"[0]" == 's');

      2. 从左到右扫描 s

        • 如果 s[i] == t[j]

          • 若此时 j == 0,说明刚匹配到 's',记录 start = i
          • j++,进入下一个要匹配的字母;
          • j == 6,说明 "swiper" 已完整匹配; 输出 start + 1(因为题目要求 1-based 下标); 程序结束。
      3. 扫描完若仍未匹配完整,则输出 -1


      参考代码

      #include <bits/stdc++.h>
      using namespace std;
      
      int main() {
          ios::sync_with_stdio(false);
          cin.tie(nullptr);
      
          string s;
          cin >> s;
          string t = "swiper";
      
          int j = 0;         
          int start = -1;
          for (int i = 0; i < (int)s.size(); i++) {
              if (s[i] == t[j]) {
                  if (j == 0) start = i;
                  j++;
                  if (j == (int)t.size()) {
                      cout << start + 1 << "\n";
                      return 0;
                  }
              }
          }
          cout << -1 << "\n";
          return 0;
      }
      

      总结

      “Swiper, no swiping! Dora 用双指针就能抓住你。”

      • 1

      信息

      ID
      1098
      时间
      1000ms
      内存
      256MiB
      难度
      8
      标签
      递交数
      149
      已通过
      22
      上传者