当前位置: 面试刷题>> 字符串置换 (经典算法题500道)
### 完整题目描述
**字符串置换**
给定两个字符串 `s1` 和 `s2`,其中 `s2` 包含了一些由 `{}` 包围的占位符,如 `"{0}"`、`"{1}"` 等,这些占位符在字符串中按升序编号(即 `{0}`、`{1}`、`{2}`...)。你需要编写一个函数,该函数接受这两个字符串作为输入,并返回一个字符串,其中 `s2` 中的每个占位符都被 `s1` 中对应位置的字符串片段所替换。如果 `s1` 中的字符串片段不足以替换所有占位符,则忽略多余的占位符;如果 `s1` 中的字符串片段多于占位符,则忽略多余的字符串片段。
**示例**:
- 输入:`s1 = "hello", s2 = "world {0}"`
- 输出:`"world hello"`
- 输入:`s1 = "apple banana cherry", s2 = "I have {0}, {1} and {2}"`
- 输出:`"I have apple, banana and cherry"`
- 输入:`s1 = "xyz", s2 = "this is a test {0} {2} {1}"`
- 输出:`"this is a test xyz {2} x"`(注意 `{2}` 未被替换,因为 `s1` 中没有足够的片段)
### PHP 示例代码
```php
function stringReplace($s1, $s2) {
$parts = preg_split('/\{(\d+)\}/', $s2, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$result = '';
$s1Parts = explode(' ', $s1); // 假设s1由空格分隔
$index = 0;
foreach ($parts as $part) {
if (is_numeric($part)) {
$index = intval($part);
if (isset($s1Parts[$index])) {
$result .= $s1Parts[$index];
}
} else {
$result .= $part;
}
}
return $result;
}
// 示例调用
echo stringReplace("hello", "world {0}"); // 输出 "world hello"
echo PHP_EOL;
echo stringReplace("apple banana cherry", "I have {0}, {1} and {2}"); // 输出 "I have apple, banana and cherry"
echo PHP_EOL;
echo stringReplace("xyz", "this is a test {0} {2} {1}"); // 输出 "this is a test xyz {2} x"
```
**注意**:此PHP示例假设`s1`由空格分隔,且占位符编号从0开始。对于更复杂的字符串分割,可能需要更复杂的处理。
### Python 示例代码
```python
def string_replace(s1, s2):
s1_parts = s1.split() # 假设s1由空格分隔
result = []
i = 0
last_end = 0
for match in re.finditer(r'\{(\d+)\}', s2):
result.append(s2[last_end:match.start()])
index = int(match.group(1))
if index < len(s1_parts):
result.append(s1_parts[index])
last_end = match.end()
result.append(s2[last_end:])
return ''.join(result)
import re
# 示例调用
print(string_replace("hello", "world {0}")) # 输出 "world hello"
print(string_replace("apple banana cherry", "I have {0}, {1} and {2}")) # 输出 "I have apple, banana and cherry"
print(string_replace("xyz", "this is a test {0} {2} {1}")) # 输出 "this is a test xyz {2} x"
```
### JavaScript 示例代码
```javascript
function stringReplace(s1, s2) {
const s1Parts = s1.split(/\s+/); // 使用正则匹配一个或多个空格来分割s1
let result = '';
let lastIndex = 0;
let match;
const regex = /\{(\d+)\}/g;
while ((match = regex.exec(s2)) !== null) {
result += s2.substring(lastIndex, match.index);
const index = parseInt(match[1]);
if (index < s1Parts.length) {
result += s1Parts[index];
}
lastIndex = regex.lastIndex;
}
result += s2.substring(lastIndex);
return result;
}
// 示例调用
console.log(stringReplace("hello", "world {0}")); // 输出 "world hello"
console.log(stringReplace("apple banana cherry", "I have {0}, {1} and {2}")); // 输出 "I have apple, banana and cherry"
console.log(stringReplace("xyz", "this is a test {0} {2} {1}")); // 输出 "this is a test xyz {2} x"
```
这些示例代码均实现了字符串置换的功能,并考虑了输入字符串的多种情况。在码小课网站上,你可以找到更多关于字符串处理和正则表达式等内容的分享,以帮助你深入学习相关知识。