diff --git a/src/main.rs b/src/main.rs index d488f45..c7c71f3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,33 +1,33 @@ -use std::cmp::max; - struct Solution; impl Solution { - pub fn min_operations(queries: Vec>) -> i64 { - let mut ans: i64 = 0; - let splits = vec![0,1,4,16,64,256,1024,4096,16384,65536,262144,1048576,4194304,16777216,67108864,268435456,1073741824]; - for query in queries { - let l = query[0]; - let r = query[1]; - let mut local_ans:i64 = 0; - for i in 1..splits.len() { - let split = splits[i]; - if split < l { - continue; - } - let left = max(l, splits[i-1]); - if split > r { - local_ans += (r - left + 1) as i64 * (i-1) as i64; - break; - } - local_ans += (split - left ) as i64 * (i-1) as i64; - } - ans += local_ans / 2 + local_ans % 2; + pub fn find_anagrams(s: String, p: String) -> Vec { + if s.len() < p.len() { + return vec![]; } - ans + let mut res = vec![]; + let mut p_count = [0; 26]; + let mut s_count = [0; 26]; + for i in 0..p.len() { + p_count[(p.as_bytes()[i] - b'a') as usize] += 1; + } + for i in 0..p.len() { + s_count[(s.as_bytes()[i] - b'a') as usize] += 1; + } + for i in p.len()..s.len() { + if p_count == s_count { + res.push((i - p.len()) as i32); + } + s_count[(s.as_bytes()[i] - b'a') as usize] += 1; + s_count[(s.as_bytes()[i - p.len()] - b'a') as usize] -= 1; + } + if p_count == s_count { + res.push((s.len() - p.len()) as i32); + } + res } } fn main() { - let sl = Solution::min_operations(vec![vec![1,2],vec![2,4]]); + let sl = Solution::find_anagrams("cbaebabacd".to_string(), "abc".to_string()); println!("{:?}", sl); }