320. Generalized Abbreviation

LeetCode medium оригинал: C# #bit-manipulation #csharp #leetcode #medium #string

Обобщенная аббревиатура слова может быть построена путем замены любых неперекрывающихся и несмежных подстрок на их соответствующие длины.

Например, "abcde" можно сократить следующим образом:

"a3e" ("bcd" заменено на "3")

"1bcd1" ("a" и "e" заменены на "1")

"5" ("abcde" заменено на "5")

"abcde" (без замены подстрок)

Однако следующие аббревиатуры недействительны:

"23" ("ab" заменено на "2" и "cde" заменено на "3") недействительно, так как выбранные подстроки смежные.

"22de" ("ab" заменено на "2" и "bc" заменено на "2") недействительно, так как выбранные подстроки перекрываются.

Дано слово word, верните список всех возможных обобщенных аббревиатур слова. Верните ответ в любом порядке.

Пример

Input: word = "a"

Output: ["1","a"]

C# решение

сопоставлено/оригинал
public class Solution {
    public IList<string> GenerateAbbreviations(string word) {
        var ans = new List<string>();
        for (int x = 0; x < (1 << word.Length); ++x)
            ans.Add(Abbr(word, x));
        return ans;
    }
    private string Abbr(string word, int x) {
        var builder = new StringBuilder();
        int k = 0, n = word.Length;
        for (int i = 0; i < n; ++i, x >>= 1) {
            if ((x & 1) == 0) {
                if (k != 0) {
                    builder.Append(k);
                    k = 0;
                }
                builder.Append(word[i]);
            } else {
                ++k;
            }
        }
        if (k != 0) builder.Append(k);
        return builder.ToString();
    }
}

C++ решение

auto-draft, проверить перед отправкой
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public vector<string> GenerateAbbreviations(string word) {
        var ans = new List<string>();
        for (int x = 0; x < (1 << word.size()); ++x)
            ans.push_back(Abbr(word, x));
        return ans;
    }
    private string Abbr(string word, int x) {
        var builder = new StringBuilder();
        int k = 0, n = word.size();
        for (int i = 0; i < n; ++i, x >>= 1) {
            if ((x & 1) == 0) {
                if (k != 0) {
                    builder.Append(k);
                    k = 0;
                }
                builder.Append(word[i]);
            } else {
                ++k;
            }
        }
        if (k != 0) builder.Append(k);
        return builder.ToString();
    }
}

Java решение

сопоставлено/оригинал
public class Solution {
    public List<String> generateAbbreviations(String word) {
        List<String> ans = new ArrayList<>();
        for (int x = 0; x < (1 << word.length()); ++x)
            ans.add(abbr(word, x));
        return ans;
    }

    private String abbr(String word, int x) {
        StringBuilder builder = new StringBuilder();
        int k = 0, n = word.length();
        for (int i = 0; i < n; ++i, x >>= 1) {
            if ((x & 1) == 0) {
                if (k != 0) {
                    builder.append(k);
                    k = 0;
                }
                builder.append(word.charAt(i));
            } else {
                ++k;
            }
        }
        if (k != 0) builder.append(k);
        return builder.toString();
    }
}

JavaScript решение

сопоставлено/оригинал
var generateAbbreviations = function(word) {
    const result = [];
    const n = word.length;
    
    for (let x = 0; x < (1 << n); x++) {
        result.push(abbr(word, x));
    }
    
    return result;
};

var abbr = function(word, x) {
    let builder = '';
    let k = 0;
    const n = word.length;
    
    for (let i = 0; i < n; i++, x >>= 1) {
        if ((x & 1) === 0) {
            if (k !== 0) {
                builder += k;
                k = 0;
            }
            builder += word[i];
        } else {
            k++;
        }
    }
    
    if (k !== 0) builder += k;
    return builder;
};

console.log(generateAbbreviations("word"));

Python решение

сопоставлено/оригинал
class Solution:
    def generateAbbreviations(self, word: str):
        def abbr(word, x):
            builder = []
            k = 0
            for i in range(len(word)):
                if x & 1 == 0:
                    if k != 0:
                        builder.append(str(k))
                        k = 0
                    builder.append(word[i])
                else:
                    k += 1
                x >>= 1
            if k != 0:
                builder.append(str(k))
            return ''.join(builder)
        
        ans = []
        for x in range(1 << len(word)):
            ans.append(abbr(word, x))
        return ans

Go решение

сопоставлено/оригинал
package main

import (
    "fmt"
    "strconv"
)

func generateAbbreviations(word string) []string {
    n := len(word)
    var result []string

    for x := 0; x < (1 << n); x++ {
        result = append(result, abbr(word, x))
    }
    return result
}

func abbr(word string, x int) string {
    var builder []byte
    k := 0

    for i := 0; i < len(word); i, x = i+1, x>>1 {
        if x&1 == 0 {
            if k != 0 {
                builder = append(builder, strconv.Itoa(k)...)
                k = 0
            }
            builder = append(builder, word[i])
        } else {
            k++
        }
    }
    if k != 0 {
        builder = append(builder, strconv.Itoa(k)...)
    }
    return string(builder)
}

func main() {
    word := "word"
    fmt.Println(generateAbbreviations(word))
}

Algorithm

Создание битовых масок

Каждая аббревиатура имеет одно к одному соответствие с n-битным двоичным числом x, где n - длина слова. Используйте эти числа в качестве чертежей для построения соответствующих аббревиатур.

Генерация аббревиатур

Для числа x просканируйте его бит за битом, чтобы определить, какие символы следует сохранить, а какие - сократить. Если бит равен 1, сохраните соответствующий символ, если 0 - замените его на счетчик.

Перебор всех комбинаций

Для каждого числа от 0 до 2^n - 1 используйте его битовое представление для создания соответствующей аббревиатуры. Сканируйте число x побитово, извлекая его последний бит с помощью b = x & 1 и сдвигая x вправо на один бит x >>= 1.

😎

Вакансии для этой задачи

Показаны активные вакансии с пересечением по тегам задачи.

Все вакансии
Активных вакансий пока нет.