rust-空间复杂度是O(1)的字符串右移

描述

给一个长度为n的字符串,怎么实现循环右移k位,k可能大于n

方案

使用undafe关键字,将string转为slice,在原slice上进行操作。

实现

lib.rs

use std::string::String;

#[derive(Debug)]
struct ShirftString {
    string :String,
    length : usize,
}

impl ShirftString {
    pub fn new(string:String)->ShirftString{
        string.is_ascii();
        let length = string.len();
        ShirftString{
            string,
            length,
        }
    }
    fn swap(&mut self,a:usize,b:usize){
        assert!(a<self.length && b<self.length);
        unsafe{
            let slice = self.string.as_bytes_mut();
            slice.swap(a,b);
        }
    }

    fn get_swap_index(&self,index:usize,shift_amount:usize) -> usize{
        let mut temp = (index+self.length-shift_amount)%self.length;
        while temp < index{
            temp = (temp+self.length-shift_amount)%self.length
        }
        return temp;
    }
    pub fn right_shirft(&mut self,shift_amount:usize){
        let _shift_amount = shift_amount%self.length;
        let mut swap_index:usize;
        for i in 0..self.length{
            swap_index = self.get_swap_index(i,_shift_amount);
            self.swap(i,swap_index);
        }
    }

    pub fn get_string(&self)->&String{
        &self.string
    }
    
}

main.rs

extern crate shirftstring;

fn main() {
    let mut s = ShirftString::new("hello world".to_string());
    s.right_shirft(5);
    println!("{}",s.get_string());
    
}

算法详解

~blablabla~

小结

> rust 无论是str还是string:String类型均无法通过索引进行读取或修改;

> 以上方案不支持除ASCII以外编码的字符串

猜你喜欢

转载自my.oschina.net/u/3703365/blog/1791913
今日推荐