Алгоритм поиска подстроки в строке Go

Помогите, пожалуйста, с заданием Написать программу для нахождения подстроки в кириллической подстроке. Программа должна запускаться с помощью команды:

go run main.go --str "строка для поиска" --substr "поиска"

Для реализации такой работы с флагами воспользуйтесь пакетом flags, а для поиска подстроки в строке вам понадобятся руны.


Ответы (2 шт):

Автор решения: Pak Uula

Насчёт рун ничего сказать не могу, а стандартными средствами ваше задание решается так: package main

import (
    "flag"
    "fmt"
    "os"
    "strings"
)

var strFlag = flag.String("str", "", "Строка, в которой нужно искать.")
var substrFlag = flag.String("substr", "", "Строка, которую нужно найти.")

func main() {
    flag.Parse()

    str := *strFlag
    substr := *substrFlag

    if str == "" {
        println("Строка не задана")
        os.Exit(1)
    }
    if substr == "" {
        println("Строка для поиска не задана")
        os.Exit(1)
    }

    idx := strings.Index(str, substr)
    if idx < 0 {
        fmt.Println("Строка не найдена")
        return
    }

    fmt.Println("Подстрока начинается с позиции ", idx)
}

go run main.go --str "строка для поиска" --substr "поиска" печатает Подстрока начинается с позиции 20

go run main.go --str "строка для поиска" --substr "неа" печатает Строка не найдена

→ Ссылка
Автор решения: Silvar

Я уже разобрался. У меня проблема была с алгоритмом и рунами, а не с самим пакетом flag).

package main

import (
    "flag"
    "fmt"
)

func main() {
    var str string
    flag.StringVar(&str, "str", "", "big string")

    var subStr string
    flag.StringVar(&subStr, "subStr", "", "sub string")

    flag.Parse()
    

    if findSubstring(str, subStr) == true {
        fmt.Println("Подстрока subStr есть в строке str")
    } else {
        fmt.Println("Подстрока subStr отсутствует в строке str")
    }
}

func findSubstring(str string, subStr string) bool {
    r := []rune(str)
    sr := []rune(subStr)
    if len(sr) == 0 {
        return false
    }
str:
    for i, ru := range r {
        if ru == sr[0] {
            for j, x := range sr[1:] {
                if r[i+j+1] != x {
                    continue str
                }
            }
            return true
        }
    }
    return false
}
→ Ссылка