Welcome to Subscribe On Youtube

767. Reorganize String

Description

Given a string s, rearrange the characters of s so that any two adjacent characters are not the same.

Return any possible rearrangement of s or return "" if not possible.

 

Example 1:

Input: s = "aab"
Output: "aba"

Example 2:

Input: s = "aaab"
Output: ""

 

Constraints:

  • 1 <= s.length <= 500
  • s consists of lowercase English letters.

Solutions

  • class Solution {
        public String reorganizeString(String s) {
            int[] cnt = new int[26];
            int mx = 0;
            for (char c : s.toCharArray()) {
                int t = c - 'a';
                ++cnt[t];
                mx = Math.max(mx, cnt[t]);
            }
            int n = s.length();
            if (mx > (n + 1) / 2) {
                return "";
            }
            int k = 0;
            for (int v : cnt) {
                if (v > 0) {
                    ++k;
                }
            }
            int[][] m = new int[k][2];
            k = 0;
            for (int i = 0; i < 26; ++i) {
                if (cnt[i] > 0) {
                    m[k++] = new int[] {cnt[i], i};
                }
            }
            Arrays.sort(m, (a, b) -> b[0] - a[0]);
            k = 0;
            StringBuilder ans = new StringBuilder(s);
            for (int[] e : m) {
                int v = e[0], i = e[1];
                while (v-- > 0) {
                    ans.setCharAt(k, (char) ('a' + i));
                    k += 2;
                    if (k >= n) {
                        k = 1;
                    }
                }
            }
            return ans.toString();
        }
    }
    
  • class Solution {
    public:
        string reorganizeString(string s) {
            vector<int> cnt(26);
            for (char& c : s) ++cnt[c - 'a'];
            int mx = *max_element(cnt.begin(), cnt.end());
            int n = s.size();
            if (mx > (n + 1) / 2) return "";
            vector<vector<int>> m;
            for (int i = 0; i < 26; ++i) {
                if (cnt[i]) m.push_back({cnt[i], i});
            }
            sort(m.begin(), m.end());
            reverse(m.begin(), m.end());
            string ans = s;
            int k = 0;
            for (auto& e : m) {
                int v = e[0], i = e[1];
                while (v--) {
                    ans[k] = 'a' + i;
                    k += 2;
                    if (k >= n) k = 1;
                }
            }
            return ans;
        }
    };
    
  • class Solution:
        def reorganizeString(self, s: str) -> str:
            n = len(s)
            cnt = Counter(s)
            mx = max(cnt.values())
            if mx > (n + 1) // 2:
                return ''
            i = 0
            ans = [None] * n
            for k, v in cnt.most_common():
                while v:
                    ans[i] = k
                    v -= 1
                    i += 2
                    if i >= n:
                        i = 1
            return ''.join(ans)
    
    
  • func reorganizeString(s string) string {
    	cnt := make([]int, 26)
    	for _, c := range s {
    		t := c - 'a'
    		cnt[t]++
    	}
    	mx := slices.Max(cnt)
    	n := len(s)
    	if mx > (n+1)/2 {
    		return ""
    	}
    	m := [][]int{}
    	for i, v := range cnt {
    		if v > 0 {
    			m = append(m, []int{v, i})
    		}
    	}
    	sort.Slice(m, func(i, j int) bool {
    		return m[i][0] > m[j][0]
    	})
    	ans := make([]byte, n)
    	k := 0
    	for _, e := range m {
    		v, i := e[0], e[1]
    		for v > 0 {
    			ans[k] = byte('a' + i)
    			k += 2
    			if k >= n {
    				k = 1
    			}
    			v--
    		}
    	}
    	return string(ans)
    }
    
  • use std::collections::{ HashMap, BinaryHeap, VecDeque };
    
    impl Solution {
        #[allow(dead_code)]
        pub fn reorganize_string(s: String) -> String {
            let mut map = HashMap::new();
            let mut pq = BinaryHeap::new();
            let mut ret = String::new();
            let mut queue = VecDeque::new();
            let n = s.len();
    
            // Initialize the HashMap
            for c in s.chars() {
                map.entry(c)
                    .and_modify(|e| {
                        *e += 1;
                    })
                    .or_insert(1);
            }
    
            // Initialize the binary heap
            for (k, v) in map.iter() {
                if 2 * *v - 1 > n {
                    return "".to_string();
                } else {
                    pq.push((*v, *k));
                }
            }
    
            while !pq.is_empty() {
                let (v, k) = pq.pop().unwrap();
                ret.push(k);
                queue.push_back((v - 1, k));
                if queue.len() == 2 {
                    let (v, k) = queue.pop_front().unwrap();
                    if v != 0 {
                        pq.push((v, k));
                    }
                }
            }
    
            if ret.len() == n {
                ret
            } else {
                "".to_string()
            }
        }
    }
    
    
  • class Solution {
        public String reorganizeString(String s) {
            return rearrangeString(s, 2);
        }
    
        public String rearrangeString(String s, int k) {
            int n = s.length();
            int[] cnt = new int[26];
            for (char c : s.toCharArray()) {
                ++cnt[c - 'a'];
            }
            PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> b[0] - a[0]);
            for (int i = 0; i < 26; ++i) {
                if (cnt[i] > 0) {
                    pq.offer(new int[] {cnt[i], i});
                }
            }
            Deque<int[]> q = new ArrayDeque<>();
            StringBuilder ans = new StringBuilder();
            while (!pq.isEmpty()) {
                var p = pq.poll();
                int v = p[0], c = p[1];
                ans.append((char) ('a' + c));
                q.offer(new int[] {v - 1, c});
                if (q.size() >= k) {
                    p = q.pollFirst();
                    if (p[0] > 0) {
                        pq.offer(p);
                    }
                }
            }
            return ans.length() == n ? ans.toString() : "";
        }
    }
    
  • class Solution {
    public:
        string reorganizeString(string s) {
            return rearrangeString(s, 2);
        }
    
        string rearrangeString(string s, int k) {
            unordered_map<char, int> cnt;
            for (char c : s) ++cnt[c];
            priority_queue<pair<int, char>> pq;
            for (auto& [c, v] : cnt) pq.push({v, c});
            queue<pair<int, char>> q;
            string ans;
            while (!pq.empty()) {
                auto [v, c] = pq.top();
                pq.pop();
                ans += c;
                q.push({v - 1, c});
                if (q.size() >= k) {
                    auto p = q.front();
                    q.pop();
                    if (p.first) {
                        pq.push(p);
                    }
                }
            }
            return ans.size() == s.size() ? ans : "";
        }
    };
    
  • class Solution:
        def reorganizeString(self, s: str) -> str:
            return self.rearrangeString(s, 2)
    
        def rearrangeString(self, s: str, k: int) -> str:
            h = [(-v, c) for c, v in Counter(s).items()]
            heapify(h)
            q = deque()
            ans = []
            while h:
                v, c = heappop(h)
                v *= -1
                ans.append(c)
                q.append((v - 1, c))
                if len(q) >= k:
                    w, c = q.popleft()
                    if w:
                        heappush(h, (-w, c))
            return "" if len(ans) != len(s) else "".join(ans)
    
    
  • func reorganizeString(s string) string {
    	return rearrangeString(s, 2)
    }
    
    func rearrangeString(s string, k int) string {
    	cnt := map[byte]int{}
    	for i := range s {
    		cnt[s[i]]++
    	}
    	pq := hp{}
    	for c, v := range cnt {
    		heap.Push(&pq, pair{v, c})
    	}
    	ans := []byte{}
    	q := []pair{}
    	for len(pq) > 0 {
    		p := heap.Pop(&pq).(pair)
    		v, c := p.v, p.c
    		ans = append(ans, c)
    		q = append(q, pair{v - 1, c})
    		if len(q) >= k {
    			p = q[0]
    			q = q[1:]
    			if p.v > 0 {
    				heap.Push(&pq, p)
    			}
    		}
    	}
    	if len(ans) == len(s) {
    		return string(ans)
    	}
    	return ""
    }
    
    type pair struct {
    	v int
    	c byte
    }
    
    type hp []pair
    
    func (h hp) Len() int { return len(h) }
    func (h hp) Less(i, j int) bool {
    	a, b := h[i], h[j]
    	return a.v > b.v
    }
    func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
    func (h *hp) Push(v any)   { *h = append(*h, v.(pair)) }
    func (h *hp) Pop() any     { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v }
    

All Problems

All Solutions