Анализ частоты повторений символов в строке текста

Условие задачи

На входе программа получает строку любого вида, а на выход она выдает строку, в который все символы заменены на:
«-», если данный символ встречается только один раз в оригинальной строке;
«+», если символ встречается более одного раза.
При установлении факта дублирования символов следует игнорировать их регистр. Например:
Входные данные / Результат

«din»        	«---» 
«recede» 	«-+-+-+» 
«Success» 	«+-++-++» 
«erpr»  	«-+-+» 

Решение

Разобьем программу на блоки; 1 — ввод строки, 2 — перевод символов в заглавные (русские буквы также переводит), 3 — формирование массива счетчиков различных символов (с использованием подпрограммы IsChar), 4 — строка результата с заменой символов на «+» или «-» , 5 — вывод.
Подпрограмма IsChar, получая на вход с1, cow, k(где k — число различных букв — размерность cow), возвращает либо номер элемента массива cow, в котором уже есть символ c1, либо -1, если его нет. При вызове ее в 1 цикле результат используется для формирования массива cow, во 2 цикле — для замены символа тем или иным знаком. Частотность повторения символов содержится в массиве cow из k элементов (символ/число вхождений). Другой вариант решения подобной задачи (для расшифровки сообщений) смотрите здесь.

Программный код:
using System;
namespace Brackets
{
    public struct CN
    {
        public char c;
        public int n;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter string:");
            string s = Console.ReadLine();
            s = s.ToUpper();    // в верхний регистр
            CN[] cow = new CN[s.Length]; // счетчик "Символ - количество"
            // начало подсчета
            int k = 0;  // число различных символов в строке (k+1)
            int g;
            cow[k].c = s[0];
            cow[k].n = 1;
            // по остальным, кроме 0-го символа
            for (int i=1; i < s.Length; i++) { g = IsChar(s[i], cow, k); if (g >= 0)
                {
                    cow[g].n++;
                }
                else
                {
                    k++;
                    cow[k].c = s[i];
                    cow[k].n = 1;
                }
            }
            // строка из скобок - результат
            string s1 = "";
            for (int i = 0; i < s.Length; i++)
            {
                g = IsChar(s[i], cow, k);
                if (cow[g].n == 1)
                    s1 += "-";
                else
                    s1 += "+";
            }      
            Console.WriteLine(s1);
        }
        // Есть ли символ с1 в увеличивающемся массиве cow 
        static int IsChar(char c1, CN[] cow, int k)
        {
            int r=-1;
            for (int i=0; i <= k; i++)
                if (c1==cow[i].c)
                {
                    r = i;
                    break;
                }
            return r;
        }
    }
}

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх