当前位置: 面试刷题>> 神奇字符串 (经典算法题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 示例代码
```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 示例代码
```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 示例代码
```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"
```
**码小课**:在码小课网站上,你可以找到更多关于算法和数据结构的详细解析和练习,帮助你提升编程技能。