rust实现同构字符串

164 阅读1分钟

这篇文章是rust解决算法问题的第六篇,感兴趣的掘友可以去jibinbin 的个人主页 - 动态 - 掘金 (juejin.cn)查看其他文章,话不多说,直接进入正题。

205. 同构字符串 - 力扣(LeetCode) (leetcode-cn.com)是一道简单的问题,是我昨天晚上刷leetcode时看到的,由于昨天时间比较晚了,就只是实现了js版本解法,今天上午才实现rust版本的。

实现思路

image.png

这道题的实现思路也很简单,利用hashmap存储单词之间的对应关系,然后遍历字符串,在这个过程中,可能会出现四种情况:

  1. s字符映射过,但新传入t字符的不相同,返回false
  2. s字符映射过,并且新传入t字符的相同,继续遍历
  3. s字符没映射过,但需要映射的t字符已经被占用了,返回false
  4. s字符没映射过,新建映射

js版本

   var isIsomorphic = function (s, t) {
        let m = new Map();

        for (let i = 0; i < s.length; i++) {
            if (m.has(s[i]) && m.get(s[i]) != t[i]) {
                return false;
            }

            if (!m.has(s[i]) && [...m.values()].includes(t[i])) {
                return false;
            }

            if (!m.has(s[i])) {
                m.set(s[i], t[i]);
            }

        }

        return true;
    };

rust版本

use std::collections::HashMap;
impl Solution {
    pub fn is_isomorphic(s: String, t: String) -> bool {
        let mut map:HashMap<&str,&str> = HashMap::new();
        let mut i = 0;
        
        if s.len() == 1 {
            return true;
        }else{
            while i < s.len() {
                if map.contains_key(&s[i..i+1]) && map.get(&s[i..i+1]) != Some(&&t[i..i+1]) {
                    return false;
                }
                
                if !map.contains_key(&s[i..i+1]) {
                    for item in map.values() {
                        if item as &str == &t[i..i+1]{
                            return false;
                        }
                    }
                }
                if !map.contains_key(&s[i..i+1]) {
                    map.insert(&s[i..i+1],&t[i..i+1]);
                }
                
                i += 1;
                
            }
        
        }
        
        true
    }
}

image.png

想要了解更多rust哈希映射的掘友可以点击HashMap in std::collections - Rust (rust-lang.org)