thảo luận Leetcode mỗi ngày

  • Người tạo chủ đề Người tạo chủ đề _Gia_Cat_Luong_
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
sweep line là sao hả bác, các bước nó ntn.
đang feed mà cứ hỏi hỏi ai trả lời cho
uq1dgnk.png
 
giống #560 nhưng dùng phép XOR thay vì phép cộng

C-like:
use std::collections::*;
impl Solution {
    pub fn find_the_longest_substring(s: String) -> i32 {
        let (bytes, n) = (s.as_bytes(), s.len());

        let presence =
            0u32 | 1u32 << b'a' - b'a' | 1u32 << b'e' - b'a' | 1u32 <<  b'i' - b'a' | 1u32 << b'o' - b'a' | 1u32 << b'u' - b'a';

        let mut pref = vec![0u32; n];
        pref[0] = 1u32 << (bytes[0] - b'a');
        for i in 1..n {
            pref[i] = (pref[i - 1] ^ (1u32 << bytes[i] - b'a')) & presence;
        }

        let mut result = 0;
        let mut seen: HashMap<u32, usize> = HashMap::new();

        for right in 0..n {
            let bitset = pref[right];

            if bitset == 0 {
                result = result.max(right + 1);
            } else if let Some(&left) = seen.get(&bitset) {
                result = result.max(right - left);
            }

            seen.entry(bitset).or_insert(right);
        }

        result as i32
    }
}

C-like:
use std::collections::*;

impl Solution {
    pub fn find_the_longest_substring(s: String) -> i32 {
        let (bytes, n) = (s.as_bytes(), s.len());

        let mut seen = vec![usize::MAX; 32];
        seen[0] = 0;

        let (mut bitset, mut result) = (0, 0);

        for (right, bc) in bytes.iter().copied().enumerate() {
             match bc {
                b'a' => bitset ^= 1,
                b'e' => bitset ^= 2,
                b'i' => bitset ^= 4,
                b'o' => bitset ^= 8,
                b'u' => bitset ^= 16,
                _ => ()
            }

            if bitset == 0 {
                result = result.max(right + 1);
            } else {
                let left = seen[bitset];

                if left != usize::MAX {
                    result = result.max(right + 1 - left);
                }
            }

            if seen[bitset] == usize::MAX {
                seen[bitset] = right + 1;
            }
        }

        result as i32
    }
}
 
Sửa lần cuối:
nay mới medium mà ít ng làm quá vậy :ops:
Python:
class Solution:
    def findTheLongestSubstring(self, s: str) -> int:
        xorMap = {}
        xorMap[0] = -1
        countMap = [0] * 5
        res = 0
        for i in range(len(s)):
            if s[i]=='u':
                countMap[0] = 1- countMap[0]
            elif s[i]=='e':
                countMap[1] = 1- countMap[1]
            elif s[i]=='o':
                countMap[2] = 1- countMap[2]
            elif s[i]=='a':
                countMap[3] = 1- countMap[3]
            elif s[i]=='i':
                countMap[4] = 1- countMap[4]
            binary = ''.join(str(x) for x in countMap)
            decimal = int(binary,2)
            if decimal in xorMap:
                res = max(res,i-xorMap[decimal])
            else:
                xorMap[decimal] = i
        return res
 
Bữa giờ không gặp prefix sum thì chắc cũng nhào vô làm 2 pointers cho bài này
C#:
public class Solution
{
    public int FindTheLongestSubstring(string s)
    {
        Dictionary<char, int> map = new(5);
        map['a'] = 0; map['e'] = 1; map['i'] = 2; map['o'] = 3; map['u'] = 4;
        
        int[] prefix = new int[s.Length + 1];
        for (int i = 1; i <= s.Length; i++)
        {
            int value = !IsVowel(s[i - 1]) ? 0 : 1 << map[s[i - 1]];
            prefix[i] = prefix[i - 1] ^ value;
        }
        
        int result = 0;
        Dictionary<int, int> dict = new();
        for (int i = 0; i < prefix.Length; i++)
        {
            if (!dict.ContainsKey(prefix[i]))
            {
                dict[prefix[i]] = i;
                continue;
            }
            result = Math.Max(i - dict[prefix[i]], result);
        }
        
        return result;
    }
    private bool IsVowel(char c)
    {
        return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
    }
}
 
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
_Gia_Cat_Luong_,
Người trả lời cuối
Vipluckystar,
Trả lời
17.755
Lượt xem
1.215.669
Quay lại
Lên đầu trang