[Rust学习:三] 循环和切片

一、前言

  • 本篇通过一个例题代码学习了:
    1. 基础for循环的写法。
    2. 哈希集合let ws: std::collections::HashSet<String> = word_dict.into_iter().collect();
  • 本篇未使用的循环知识:
    1. while。
    2. loop。

  • rust不支持cpp那种三段式for循环,但是支持range循环,类似于python,但比python多支持一个=.
    let n = 5;
    for i in 0..n {print!("{}",i)}  // 0~n-1
    for i in 0..=n {print!("{}",i)} // 0~n
    let	a: Vector<usize> = vec![0,1,2,3,4];
    for i in a.iter() {print!("{}",i)}
    for i in a[0..n].iter(){print!("{}",i)}
    for i in a[0..=n-1].iter(){print!("{}",i)}
    for i in 0..n {print!("{}",a[i])}
    
  • 如果需要特殊退出条件,需要使用while自己控制变量的变化。
  • rust还有一个特殊的循环:loop {}
    • loop的特殊之处在于它默认等价于while True,即直接进入循环,且期待内部break;
    • break右边可以接表达式,作为loop{}模块的返回值,这经常用户循环查找答案的场景。
    • 以下摘自https://www.runoob.com/rust/rust-loop.html
      fn main() {
      let s = ['R', 'U', 'N', 'O', 'O', 'B'];
      let mut i = 0;
      let location = loop {
          let ch = s[i];
          if ch == 'O' {
              break i;
          }
          i += 1;
      };
      println!(" \'O\' 的索引为 {}", location);
      
    }
    ```

二、练习

1. 习题 [139. 单词拆分]

139. 单词拆分

2. 题解

  • 这是一个基础的DP:
    • 定义f[i]为以i为结尾的前缀s[:i+1]是否能被拆分,那么f[n-1]就是答案。
    • 显然每次转移到i时,对于每个j(<0=j<=i),若同时满足:s[j:i+1]这个串在字典中、且f[j-1]为True,则f[i]是True。
    • 实现时,由于最左边的空串是True,因此把f坐标右移一位,方便编码。
    • 这题可以优化,因为字典长度不超过20,但是由于数据很小,没必要。

3. 代码实现。

impl Solution {
    pub fn word_break(s: String, word_dict: Vec<String>) -> bool {
        let ws: std::collections::HashSet<String> = word_dict.into_iter().collect();
        let n = s.len();
        let mut f = vec![false;n+1];
        f[0] = true;
        for i in 0..n {
            for j in 0..=i {
                if f[j] && ws.contains(&s[j..=i].to_string()) {
                    f[i+1] = true;
                    break;
                }
            }                
        }
    return f[n];
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值