题目

标题和出处

标题:重新排列字符串

出处:1528. 重新排列字符串

难度

3 级

题目描述

要求

给你一个字符串 字符串题目:重新排列字符串 - 图1 和一个长度相同的整数数组 字符串题目:重新排列字符串 - 图2

请你重新排列字符串 字符串题目:重新排列字符串 - 图3,其中第 字符串题目:重新排列字符串 - 图4 个字符需要移动到 字符串题目:重新排列字符串 - 图5 指示的位置。

返回重新排列后的字符串。

示例

示例 1:

字符串题目:重新排列字符串 - 图6

输入:字符串题目:重新排列字符串 - 图7
输出:字符串题目:重新排列字符串 - 图8
解释:如图所示,字符串题目:重新排列字符串 - 图9 重新排列后变为 字符串题目:重新排列字符串 - 图10

示例 2:

输入:字符串题目:重新排列字符串 - 图11
输出:字符串题目:重新排列字符串 - 图12
解释:重新排列后,每个字符都还留在原来的位置上。

示例 3:

输入:字符串题目:重新排列字符串 - 图13
输出:字符串题目:重新排列字符串 - 图14

示例 4:

输入:字符串题目:重新排列字符串 - 图15
输出:字符串题目:重新排列字符串 - 图16

示例 5:

输入:字符串题目:重新排列字符串 - 图17
输出:字符串题目:重新排列字符串 - 图18

数据范围

  • 字符串题目:重新排列字符串 - 图19
  • 字符串题目:重新排列字符串 - 图20
  • 字符串题目:重新排列字符串 - 图21 仅包含小写英文字母
  • 字符串题目:重新排列字符串 - 图22
  • 字符串题目:重新排列字符串 - 图23 的所有的值都是唯一的(字符串题目:重新排列字符串 - 图24 是整数 字符串题目:重新排列字符串 - 图25字符串题目:重新排列字符串 - 图26 形成的一组排列)

解法

思路和算法

假设将字符串 字符串题目:重新排列字符串 - 图27 根据数组 字符串题目:重新排列字符串 - 图28 重新排列后的字符串是 字符串题目:重新排列字符串 - 图29,则 字符串题目:重新排列字符串 - 图30 的第 字符串题目:重新排列字符串 - 图31 个字符在 字符串题目:重新排列字符串 - 图32 中位于第 字符串题目:重新排列字符串 - 图33 个位置,即 字符串题目:重新排列字符串 - 图34

遍历字符串 字符串题目:重新排列字符串 - 图35 和数组 字符串题目:重新排列字符串 - 图36 的过程中,即可知道 字符串题目:重新排列字符串 - 图37 的每个字符在 字符串题目:重新排列字符串 - 图38 中的位置。可以创建一个 字符串题目:重新排列字符串 - 图39 类型的数组 字符串题目:重新排列字符串 - 图40 存储 字符串题目:重新排列字符串 - 图41 的结果。对于长度为 字符串题目:重新排列字符串 - 图42 的字符串 字符串题目:重新排列字符串 - 图43 和数组 字符串题目:重新排列字符串 - 图44,当 字符串题目:重新排列字符串 - 图45 时,将 字符串题目:重新排列字符串 - 图46 赋值给 字符串题目:重新排列字符串 - 图47 即可。

遍历结束之后,字符串题目:重新排列字符串 - 图48 的全部位置都填入了字符,将 字符串题目:重新排列字符串 - 图49 转成字符串,即为重新排列后的字符串。

代码

  1. class Solution {
  2. public String restoreString(String s, int[] indices) {
  3. int n = indices.length;
  4. char[] array = new char[n];
  5. for (int i = 0; i < n; i++) {
  6. array[indices[i]] = s.charAt(i);
  7. }
  8. return new String(array);
  9. }
  10. }

复杂度分析

  • 时间复杂度:字符串题目:重新排列字符串 - 图50#card=math&code=O%28n%29&id=Rnxa9),其中 字符串题目:重新排列字符串 - 图51 是字符串 字符串题目:重新排列字符串 - 图52 和数组 字符串题目:重新排列字符串 - 图53 的长度。需要遍历字符串 字符串题目:重新排列字符串 - 图54 一次,遍历的过程中重新排列字符串,新字符串的每个位置的字符需要 字符串题目:重新排列字符串 - 图55#card=math&code=O%281%29&id=lGdaq) 的时间填入。
  • 空间复杂度:字符串题目:重新排列字符串 - 图56#card=math&code=O%28n%29&id=PEuGm),其中 字符串题目:重新排列字符串 - 图57 是字符串 字符串题目:重新排列字符串 - 图58 和数组 字符串题目:重新排列字符串 - 图59 的长度。需要额外创建一个长度为 字符串题目:重新排列字符串 - 图60字符串题目:重新排列字符串 - 图61 类型的数组用于存储重新排列后的字符串。由于 Java 中的 字符串题目:重新排列字符串 - 图62 类型的对象不可变,因此空间复杂度至少为 字符串题目:重新排列字符串 - 图63#card=math&code=O%28n%29&id=PvJ7V)。