Как создать регулярное выражение для поиска повторяющегося символа в строке? - PullRequest
0 голосов
/ 29 мая 2019

Например:

  1. HelloWorld - повторяющихся символов 5 (l повторяется 3 раза и o повторяется 2 раза)
  2. Smart2000, повторяющиеся символы = 3? (0 повторяется 3 раза)
  3. Смарт @ 200 @ 12, повторяющиеся символы = 6

Я пытался перебрать строку

Вот мой код с итерацией строки для поиска повторяющегося символа в строке.

func countRepeatDigitsIn(keyword : String) -> Int
{
    // To keep track of processed symbols
    var uniqueCharacters = ""
    var repeatCharacterCount = 0

    for char in keyword.uppercased() {
        let alphabet = String(char)

        // If this is already counted, skip it
        if (uniqueCharacters.contains(alphabet))
        {
            repeatCharacterCount += 1
        }

        // Otherwise, add it to processed symbols
        uniqueCharacters += alphabet
    }

    return repeatCharacterCount
}

Ответы [ 3 ]

3 голосов
/ 29 мая 2019

HelloWorld - повторяющихся символов 5 (l повторяется 3 раза и o повторяется 2 раза

Самый простой способ получить такой результат - взять гистограмму и затем сложить всезначения, которые не равны 1.

Пример:

func histogram(_ s:String) -> [Character:Int] {
    var d = [Character:Int]()
    for c in s {
        d[c, default:0] += 1
    }
    return d
}
let reps = histogram("helloworld").values.filter{$0 > 1}.reduce(0, +) // 5
let reps2 = histogram("smart2000").values.filter{$0 > 1}.reduce(0, +) // 3
let reps3 = histogram("Smart@200@12").values.filter{$0 > 1}.reduce(0, +) // 6
0 голосов
/ 29 мая 2019

Сгруппируйте одинаковые символы в словаре, используя Словарь (группировка: по:) и добавьте количество значений, если количество больше 1

extension String {
    func repeatCount() -> Int {
        return Dictionary(grouping: lowercased()) { $0 }.values.filter { $0.count > 1 }.reduce(0) { $0 + $1.count }
    }
}
print("HelloWorLd".repeatCount())//5
print("Smart2000".repeatCount())//3
print("Smart@200@12".repeatCount())//6
0 голосов
/ 29 мая 2019

Вот забавная цепочка сокращений и фильтров для символов строки.

func countRepeatDigitsIn(keyword : String) -> Int {
    let total = Array(keyword.uppercased()).reduce(into: [Character : Int]()) { $0[$1, default: 0] += 1 }.filter { $0.value > 1 }.reduce(0) { $0 + $1.value }

    return total
}

for text in ["HelloWorld", "Smart2000", "Smart@200@12"] {
    print(text, countRepeatDigitsIn(keyword: text))
}

Первый reduce создает словарь, в котором ключи - это символы, а значения - это количество символов.Затем фильтр удаляет символы, найденные только один раз.Второе уменьшение добавляет оставшиеся значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...