Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gantikan subrentetan berulang dalam rentetan dengan menggantikan hanya satu daripadanya

Gantikan subrentetan berulang dalam rentetan dengan menggantikan hanya satu daripadanya

PHPz
PHPzke hadapan
2024-02-09 08:15:29970semak imbas

Gantikan subrentetan berulang dalam rentetan dengan menggantikan hanya satu daripadanya

editor php Yuezi menggantikan subrentetan berulang dalam rentetan Adalah masalah biasa untuk menggantikan salah satu daripadanya. Dalam pemprosesan rentetan, kadangkala kita perlu menggantikan subrentetan berulang dalam rentetan, tetapi kita tidak mahu menggantikan semua subrentetan berulang, tetapi hanya satu daripadanya. Ini boleh mengekalkan subrentetan lain yang serupa sambil mencapai kesan penggantian yang kita inginkan. Dalam PHP, kita boleh mencapai keperluan ini dengan bantuan beberapa fungsi terbina dalam dan ungkapan biasa. Di bawah, kami akan memperkenalkan secara terperinci bagaimana untuk melaksanakan kaedah menggantikan hanya satu daripada subrentetan berulang dalam rentetan.

Kandungan soalan

Saya sedang membuat permainan algojo yang mudah dengan go tetapi saya menghadapi pepijat di mana rentetan unknown_string (yang akan ditunjukkan dalam kod) mempunyai aksara _ jadi pemain lain yang meneka huruf itu boleh melihat panjang perkataan , setiap kali pemain memasukkan huruf yang betul, saya mahu ia menggantikan nth (n bergantung pada indeks di mana huruf itu ditemui dalam perkataan) _ watak dengan huruf itu, ini telah berjaya, tetapi terdapat masalah. Jika perkataan mempunyai dua huruf berulang, hanya satu daripadanya diganti.

Saya mencipta fungsi berasingan yang dipanggil iterate (fungsi ini dicipta kerana saya ingin mengelakkan kod bersarang) untuk melelaran ke atas semua indeks. Tetapi ia tidak berfungsi, kodnya adalah seperti berikut:

package main

import (
    "fmt"
    "strings"
)

var input string
var word string
var unknown_word []string
var unknown_word_string string
var index int
var guesses int
var change_unknown_word_string []byte

func main() {
    fmt.Println("Welcome to hangman")
    fmt.Println("Player 1, choose a word!")
    fmt.Scan(&word)
    for i := 1; i <= len(word); i++ {
        unknown_word = append(unknown_word, "_")
    }
    unknown_word_string = strings.Join(unknown_word, "")
    for {
        fmt.Println("Player 2, guess a letter or a word")
        fmt.Println(unknown_word_string)
        fmt.Scan(&input)
        if guesses == 6 {
            fmt.Println("Player 2 lost! Player 1's word was: ", word)
            break
        } else if unknown_word_string == input {
            fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the letter!")
        }
        if strings.Contains(word, input) && word != input {
            index = strings.Index(word, input)
            iterate()
            fmt.Println("You guessed a letter!")
        } else if word == input {
            fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the whole word!")
            break
        } else {
            fmt.Println("Nothing found")
            guesses++
        }
    }
}
func iterate() {
    change_unknown_word_string = []byte(unknown_word_string)
    for i := 0; i < len(change_unknown_word_string); i++ {
        if change_unknown_word_string[i] == change_unknown_word_string[index] {
            change_unknown_word_string[i] = []byte(input)[0]
        }
    }
    unknown_word_string = string(change_unknown_word_string)
}

Penyelesaian

Perbandingan if change_unknown_word_string[i] == change_unknown_word_string[index] 没有任何意义,因为 unknown_word_string 显然在这些位置包含 _.

Anda harus membandingkan word[i] == input[0] dalam satu gelung.

Tetapi ambil perhatian, tambah string 转换为 byte 数组不支持 unicode。最好使用 runes (titik kod unikod) supaya anda tidak lagi terhad kepada aksara latin1.

func iterate() {
    needle := []rune(input)[0]
    haystack := []rune(word)
    buf := []rune(unknown_word_string)
    for i := range haystack {
        if haystack[i] == needle {
            buf[i] = needle
        }
    }
    unknown_word_string = string(buf)
}

P.S. Perbandingan ini salah

if unknown_word_string == input {
            fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the letter!")
        }

Sepatutnya ifunknown_word_string == word 并位于调用 iterate() selepas.

Atas ialah kandungan terperinci Gantikan subrentetan berulang dalam rentetan dengan menggantikan hanya satu daripadanya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam