当前位置: 面试刷题>> 神奇字符串 (经典算法题500道)


题目描述补充

神奇字符串生成器

给定一个初始字符串 S 和一个整数 n,请设计一个算法来生成一个长度为 n 的神奇字符串。神奇字符串的生成规则如下:

  1. 初始字符串 S 至少包含两个字符,且第一个字符一定是 'b',第二个字符一定是 'a''c'
  2. 对于字符串中的每个位置 i(从第三个字符开始,即 i >= 2),字符 S[i] 的值基于 S[i-1]S[i-2]
    • 如果 S[i-1]'a'S[i-2]'b',则 S[i]'c'
    • 如果 S[i-1]'b'S[i-2]'a',则 S[i]'a'
    • 如果 S[i-1]'c'S[i-2]'c',则 S[i]'b'
  3. 如果生成的字符串长度小于 n,继续根据上述规则生成字符直到字符串长度为 n

示例

  • 初始字符串 S = "ba"n = 7,则生成的神奇字符串为 "bacabbc"
    • 初始:"ba"
    • 规则应用:'a''b''c' -> "bac"
    • 规则应用:'c''a''b' -> "bacb"
    • 规则应用:'b''c''a' -> "bacba"
    • 规则应用:'a''b''c' -> "bacbac"
    • 规则应用:'c''a''b' -> "bacbacb"
    • 此时长度已等于 n,所以停止生成。

PHP 示例代码

function generateMagicString($S, $n) {
    $magicString = $S;
    while (strlen($magicString) < $n) {
        $lastChar = $magicString[strlen($magicString) - 1];
        $secondLastChar = $magicString[strlen($magicString) - 2];
        
        if ($lastChar == 'a' && $secondLastChar == 'b') {
            $magicString .= 'c';
        } elseif ($lastChar == 'b' && $secondLastChar == 'a') {
            $magicString .= 'a';
        } else {
            $magicString .= 'b';
        }
    }
    
    return substr($magicString, 0, $n);
}

// 示例
$initialString = "ba";
$n = 7;
echo generateMagicString($initialString, $n);  // 输出 "bacabbc"

Python 示例代码

def generate_magic_string(S, n):
    magic_string = S
    while len(magic_string) < n:
        last_char = magic_string[-1]
        second_last_char = magic_string[-2]
        
        if last_char == 'a' and second_last_char == 'b':
            magic_string += 'c'
        elif last_char == 'b' and second_last_char == 'a':
            magic_string += 'a'
        else:
            magic_string += 'b'
    
    return magic_string[:n]

# 示例
initial_string = "ba"
n = 7
print(generate_magic_string(initial_string, n))  # 输出 "bacabbc"

JavaScript 示例代码

function generateMagicString(S, n) {
    let magicString = S;
    while (magicString.length < n) {
        const lastChar = magicString[magicString.length - 1];
        const secondLastChar = magicString[magicString.length - 2];
        
        if (lastChar === 'a' && secondLastChar === 'b') {
            magicString += 'c';
        } else if (lastChar === 'b' && secondLastChar === 'a') {
            magicString += 'a';
        } else {
            magicString += 'b';
        }
    }
    
    return magicString.slice(0, n);
}

// 示例
const initialString = "ba";
const n = 7;
console.log(generateMagicString(initialString, n));  // 输出 "bacabbc"

码小课:在码小课网站上,你可以找到更多关于算法和数据结构的详细解析和练习,帮助你提升编程技能。

推荐面试题