Python. Примеры решения задач на строки символов. Часть 1




Примеры решения задач на строки символов. Часть 1

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

Перед изучением темы рекомендуется ознакомиться с темами:


Содержание


Search other websites:

1. Рекурсивная функция CountCharacterToString(). Определение количества вхождений заданного символа в строке

 

# Рекурсивная функция - возвращает количество входжений
# указанного символа в списке
def CountCharacterToString(c, s):
    if s=="": # условие завершения цикла
        return 0
    else:
        if c==s[0]: # сравнение символа с первым элементом строки
            return 1 + CountCharacterToString(c, s[1:]) # рекурсивный вызов
        else:
            return CountCharacterToString(c, s[1:])

# Вызвать функцию CountCharacterToString()
n = CountCharacterToString('a', "jprstaajklmnabcdadsad")
print("n = ", n)

Результат выполнения программы

n = 5

 

2. Функция IsCharDigit(). Определить, есть ли цифрой символ, заданный номером позиции в строке

Функция IsCharDigit() определяет, является ли цифрой символ, который размещается в указанной позиции строки. Функция получает параметры:

  • строку, в которой осуществляется поиск;
  • номер позиции символа, который нужно проверить.

Ниже приведены 4 способа реализации функции.

2.1. Способ 1. Непосредственное определение принадлежности символа диапазону цифр

При этом способе для определения цифры используется сравнение вида

(s[index]>='0') and (s[index]<='9')

в котором осуществляется определение принадлежности отдельного символа s[index] диапазону чисел от ‘0’ до ‘9’.

# Определение, есть ли в заданной позиции строки цифра
def IsCharDigit(s, index):
    # Проверка, корректно ли значение index
    if (index<0)or(index>len(s)-1):
        return False
    return (s[index]>='0')and(s[index]<='9')

# Ввод строки
s = input("s = ")

# Ввод индекса
index = int(input("index = "))

# Вывод результата
if IsCharDigit(s, index):
    print("Yes")
else:
    print("No")

Результат выполнения программы

s = ABC123DEF
index = 4
Yes

 

2.2. Способ 2. Использование функции ord()

В этом способе можно использовать функцию ord(), которая возвращает код символа. Символ ‘0’ имеет код 48, символ ‘1’ имеет код 49 и т.д. Соответственно, символ, соответствующий последней цифре, имеет код 57.

Поэтому, в вышеприведенном примере (способ 1) фрагмент строки

(s[index]>='0')and(s[index]<='9')

можно заменить следующим фрагментом строки

(ord(s[index])>=48)and(ord(s[index])<=57)

 

2.3. Способ 3. Использование стандартной функции isdigit()

Функция isdigit() из библиотеки Python позволяет определить, является ли символ цифрой. С учетом этого, модифицированный вариант функции IsCharDigit() имеет вид

# Определение, размещается ли цифра в заданной позиции строки
def IsCharDigit(s, index):
    # Проверка, корректно ли значение index
    if (index<0)or(index>len(s)-1):
        return False
    return s[index].isdigit()

# Ввод строки
s = input("s = ")

# Ввод индекса
index = int(input("index = "))

# Вывод результата
if IsCharDigit(s, index):
    print("Yes")
else:
    print("No")

 

2.4. Способ 4. Использование строки сравнения

Этот способ хорошо подходит для определения принадлежности символа некоторому множеству символов, содержащему все возможные значения. Символы, образующие множество символов для сравнения, формируются в виде строки. В нашем случае сравниваются символы цифр, поэтому строка сравнения имеет вид:

sAll = "0123456789"

Вышеприведенная строка содержит все множество цифр числа. В соответствии с вышесказанным, измененная функция IsCharDigit() выглядит следующим образом.

# Определение, размещается ли цифра в указанной позиции строки
def IsCharDigit(s, index):
    # Проверка, корректно ли значение index
    if (index<0)or(index>len(s)-1):
        return False

    # Строка, содержащая все возможные значения, соответствующие цифре
    sAll = "0123456789"

    # Цикл поиска в строке sAll символа s[index]
    for c in sAll:
        if c == s[index]: # если символ s[index] есть в наборе допустимых символов
            return True

    return False

# Ввод строки
s = input("s = ")

# Ввод индекса
index = int(input("index = "))

# Вывод результата
if IsCharDigit(s, index):
    print("Yes")
else:
    print("No")

 

3. Функция IsCharOp(). Определить количество символов +, –, *, /, % в строке

Функция IsCharOp() получает параметром строку и определяет количество символов операций (+, –, *, /, %) в этой строке. Чтобы уменьшить количество сравнений, в функции используется дополнительная строка

sAll = "+-*/%"

которая содержит все допустимые символы операций.

# Определение, размещается ли цифра в указанной позиции строки
def IsCharOp(s):

    # Строка, содержащая все возможные значения, которые соответствуют цифре
    sAll = "+-*/%"

    # Цикл определения количества символов в строке
    k = 0 # результат
    for c1 in s:
        for c2 in sAll:
            if c1==c2:
                k = k+1

    return k

# Ввод строки
s = input("s = ")

# Вычисление и вывод результата
k = IsCharOp(s)
print("k = ", k)

Результат выполнения программы

s = fhg+-/*%%%++-ghjg+-%
k = 13

 

4. Функция GetNOccurs(). Определение, сколько раз в данной строке встречается указанная строка
4.1. Использование стандартной функции count()

В языке Python есть функция count(), которая определяет, сколько раз в данной строке встречается заданная подстрока.

# Определить, сколько в строке встречается подстрока
s1 = "abc abcd bcd defg bcdef"
s2 = "bc"
k = s1.count(s2)
print("k = ", k)

Результат выполнения программы

k = 4

 

4.2. Решение без использования функции count()

 

# Определеть, сколько в строке встречается подстрока
def GetNOccurs(sub, s):
    k = 0 # результат
    index_s = 0 # позиция в строке s из которой происходит поиск подстроки

    while (index_s < len(s)):
        f_is=True # флажок наличия подстроки в строке
        index_sub = 0 # индекс начала сравнения в строке sub

        # цикл поиска подстроки в строке
        while index_sub<len(sub):
            # проверка, достигнут ли конец строки s
            if (index_s+index_sub) == len(s):
                f_is = False
                index_s = len(s)-1
                break

            # проверка на несовпадение символов
            if s[index_s+index_sub]!=sub[index_sub]:
                f_is = False
                break
            else:
                index_sub = index_sub+1

        # Проверка, все ли символы строки и подстроки совпали
        if f_is:
            index_s = index_s + len(sub) # обаботка, если совпали
            k = k+1
        else:
            index_s = index_s+1 # обработка, если не совпали

    return k

# Использование функции GetNOccurs()
s1 = "abccc bcccca bcd"
s2 = "cc"
k = GetNOccurs(s2, s1)
print("k = ", k)

Результат выполнения программы

k = 3

 

5. Функция GetPosFirstOccur(). Определить позицию (номер) первого вхождения подстроки в строке

В языке Python есть целый ряд стандартных функций, которые определяют позицию вхождения подстроки в строке. Более подробно об этих стандартных функциях описывается здесь.

В данном примере реализована собственная функция GetPosFirstOccur(), которая определяет позицию (номер) первого вхождения подстроки в строке.

# Определить позицию первого вхождения подстроки в строке.
# Строка просматривается слева-направо.
def GetPosFirstOccur(sub, s):
    index_s = 0 # позиция в строке s из которой происходит поиск подстроки

    while (index_s < len(s)):
        f_is=True # флажок наличия подстроки в строке
        index_sub = 0 # индекс начала сравнения в строке sub

        # цикл поиска подстроки в строке
        while index_sub<len(sub):
            # проверка, не достигнут ли конец строки s
            if (index_s+index_sub) == len(s):
                f_is = False
                index_s = len(s)-1
                break

            # проверка на несовпадение символов
            if s[index_s+index_sub]!=sub[index_sub]:
                f_is = False
                break
            else:
                index_sub = index_sub+1

        # Проверка, все ли символы строки и подстроки совпали
        if f_is:
            return index_s # если совпали, то вернуть позицию
        else:
            index_s = index_s+1 # обработка, если не совпали

    return -1 # если не найдена подстрока, то вернуть -1

# Использование функции GetPosFirsOccur()
s1 = "abccc bcccca bcd"
s2 = "cd"
pos = GetPosFirstOccur(s2, s1)
print("pos = ", pos)

Результат выполнения программы

pos = 14

 

6. Функция IsSubstringToString(). Определение наличия подстроки в строке

Версия 1. В данной функции можно вызывать предварительно разработанную функцию GetNOccurs() из пункта 4.2. Затем обработать возвращенное значение k. Если k>0, то подстрока есть в строке, если k = 0, то подстроки в строке нет. Текст функции будет примерно следующим:

# Функция IsSubstringToString()
def IsSubstringToString(sub, s):
    k = GetNOccurs(sub, s) # Вызвать функцию из п. 4.2.
    if (k==0):
        return False
    else:
        return True

 


Связанные темы