贪心

在此提供一个题解区代码最短的简单解法。

题目大意

现在给你两个字符串 ,你可以选择两种方式来完全匹配

  • 里面取出一个长度为 的子序列(可以不连续);
  • 里面取出一个长度为 的子序列(同理),并在末尾加上 X

输出能否完全匹配

思路

首先,如果 的末尾是 ,那么第二种方式才是有用的,在这种情况下我们只需要将 的最后一个字符删掉来匹配就行了。

然后考虑取子序列,我们可以使用一个指针 来描述字符串 我们已经匹配到了多少位。遍历 ,如果当前字符能够继续匹配 的话,那么就将指针右移,最后看一看有没有匹配完全即可。

代码

import java.util.*
 
val cin = Scanner(System.`in`)
 
val s = cin.next()
var t = cin.next()
var p = 0
 
fun main() {
  if (t.last() == 'X') {                   // 如果末尾为 X
    t = t.substring(0, t.length - 1)       // 删掉最后一个
  }
  for (c in s) {                           // 遍历 S
    if (p < t.length && c - 32 == t[p]) {  // 如果没有超出限制并能继续匹配
      p++                                  // 多匹配一个
    }
  }
  // 最后判断一下匹没匹配完就行了
  println(if (p == t.length) "Yes" else "No")
}