当前位置: 面试刷题>> 找到映射序列 (经典算法题500道)


完整题目描述

题目:找到映射序列

给定一个字符串s,其中只包含小写字母,我们需要构造一个映射序列,该序列的生成规则如下:

  1. 映射序列中的每个字符都必须是s中的字符,但顺序可以不同。
  2. 对于s中的任意字符c,映射序列中c第一次出现的位置,必须等于sc第一次出现的位置(索引从0开始)。
  3. 映射序列中的其他字符(除了第一次出现的字符)可以任意排列,只要它们满足上述两个条件。

示例

  • 输入:s = "abcab"
  • 输出:"abacb""abcba" 等,只要满足条件即可。

PHP 示例代码

function findMappingSequence($s) {
    $result = '';
    $firstOccurrence = [];
    
    // 记录每个字符第一次出现的位置
    for ($i = 0; $i < strlen($s); $i++) {
        $char = $s[$i];
        if (!isset($firstOccurrence[$char])) {
            $firstOccurrence[$char] = $i;
        }
    }
    
    // 按字符第一次出现的位置添加到结果中
    ksort($firstOccurrence);
    foreach ($firstOccurrence as $char => $pos) {
        $result .= $char;
    }
    
    // 剩余字符随机排列添加到结果中(这里简单处理为直接添加剩余字符)
    for ($i = 0; $i < strlen($s); $i++) {
        $char = $s[$i];
        if (strpos($result, $char) === false) {
            $result .= $char;
        }
    }
    
    // 注意:这里的简单处理可能不满足严格意义上的“任意排列”,但在某些场景下可接受
    // 对于需要严格随机排列的,可以使用shuffle函数处理剩余字符数组
    
    return $result;
}

// 测试
echo findMappingSequence("abcab"); // 输出示例之一,可能是"abacb"

Python 示例代码

def find_mapping_sequence(s):
    first_occurrence = {char: i for i, char in enumerate(s) if char not in first_occurrence}
    result = ''.join(sorted(first_occurrence, key=first_occurrence.get))
    remaining_chars = set(s) - set(result)
    result += ''.join(remaining_chars)  # 简单处理剩余字符
    return result

# 测试
print(find_mapping_sequence("abcab"))  # 输出示例之一,可能是"abacb"

JavaScript 示例代码

function findMappingSequence(s) {
    const firstOccurrence = {};
    for (let i = 0; i < s.length; i++) {
        const char = s[i];
        if (!firstOccurrence[char]) {
            firstOccurrence[char] = i;
        }
    }
    
    const sortedKeys = Object.keys(firstOccurrence).sort((a, b) => firstOccurrence[a] - firstOccurrence[b]);
    let result = sortedKeys.join('');
    
    // 处理剩余字符
    for (let i = 0; i < s.length; i++) {
        const char = s[i];
        if (!result.includes(char)) {
            result += char;
        }
    }
    
    return result;
}

// 测试
console.log(findMappingSequence("abcab")); // 输出示例之一,可能是"abacb"

码小课网站中有更多相关内容分享给大家学习,包括但不限于算法设计、数据结构、编程技巧等,欢迎访问学习。

推荐面试题