942. 增减字符串匹配

这一题初看题目能想到一个简单地办法就是,不管如何我都用0开始构造,遇到I的时候减,遇到D的时候当前以及往前都加,细想一下,会到最坏n方的情况。
然后再去看题目,其实有一个很简单的规律:
_s_[_i_]=_I_ 时,使用当前最小值进行构造,当 _s_[_i_]=_D_ 时使用当前最大值进行构造,数学归纳法可以证明:
image.png

  1. /// 942. 增减字符串匹配
  2. pub fn di_string_match(s: String) -> Vec<i32> {
  3. let mut ret = vec![0; s.len() + 1];
  4. let (mut l, mut r) = (0, s.len() as i32);
  5. s.chars().enumerate().for_each(|(i, b)| {
  6. if b == 'I' {
  7. ret[i] = l;
  8. l += 1
  9. } else {
  10. ret[i] = r;
  11. r -= 1
  12. }
  13. });
  14. ret[s.len()] = l;
  15. ret
  16. }