이 문제에서는 배열 값에 따라 주어진 문자열에 대해 M개의 역방향 질의를 수행하겠습니다.
문제를 해결하는 순진한 접근 방식은 주어진 배열 값에 따라 각 문자열 세그먼트를 반대로 바꾸는 것입니다.
최적화된 접근 방식은 동일한 하위 문자열을 두 번 뒤집으면 원래 문자열을 얻는 논리를 사용합니다.
문제 설명 − 알파벳 문자가 포함된 알파 문자열을 제공했습니다. 또한 양의 정수를 포함하는 M 크기의 arr[] 배열을 제공했습니다. 주어진 문자열에 대해 M 연산을 수행하고 최종 문자열을 반환해야 합니다.
각 연산에서 우리는 arr[i]를 가져와서 하위 문자열 arr[i]를 N − arr[i] + 1로 되돌려야 합니다.
示例例子
输入
으아악输출
으아악설명
执行第一个查询后,字符串变为 'psrqt'。
执行第二个查询后,我们得到了 'tqrsp'。
输入
으아악输출
으아악설명 − 如果我们对同一个查询执行偶数次,我们会得到串串。
输入
으아악输출
으아악Explanation − 동일한 쿼리를 홀수 번 수행하면 문자열의 반대가 나옵니다.
이 접근 방식에서는 reverse() 메서드를 사용하여 하위 문자열을 반전합니다. 주어진 쿼리를 사용하여 시작 및 끝 포인터를 취하고 주어진 문자열의 하위 문자열을 반전시킵니다.
步骤 1 - 开始遍历查询数组。
第2步 - 使用arr[p] - 1初始化'left'变weight。
3단계 − str_len − arr[p] + 1을 사용하여 'right' 변수를 초기화합니다.
4단계 − reverse() 메서드를 사용하여 하위 문자열을 왼쪽 포인터에서 오른쪽 포인터로 반전시킵니다.
시간 복잡도 − 부분 문자열을 M번 뒤집는 경우 O(N*M)입니다.
공간 복잡성 − 동적 공간을 사용하지 않으므로 O(1)입니다.
이 접근 방식에서는 특정 쿼리를 사용하여 해당 특정 인덱스와 반전에 포함된 횟수를 계산합니다. 인덱스가 짝수 번 포함되면 이를 되돌릴 필요가 없습니다. 주어진 모든 쿼리에 인덱스가 홀수 번 포함된 경우 특정 인덱스의 문자를 뒤집어야 합니다.
步骤 1 - 初始ization长島等于字符串长島 的 'cnt' 列表,用 0 存储特引反转中流现的次数。
2단계 − 주어진 쿼리 배열을 탐색하고 현재 쿼리에 따라 문자열의 왼쪽 및 오른쪽 포인터를 가져옵니다.
3단계 − 또한 현재 쿼리의 왼쪽 및 오른쪽 포인터에 따라 'cnt' 목록을 업데이트하려면changeRange() 함수를 실행하세요.
3.1단계 −changeRange() 함수에서 'cnt' 목록의 '왼쪽' 인덱스에 있는 값을 증가시킵니다.
第3.2步 - 减小“cnt”列表中位于“right + 1”指针右侧的所有值。
여기서는 [왼쪽, 오른쪽] 범위에서 'cnt' 목록의 모든 값을 1씩 증가시켜야 했습니다. 따라서 접두사 sum을 사용하면 모든 값이 '왼쪽' 인덱스의 오른쪽에 있는 1만큼 증가하기 때문에 cnt[left]만 1만큼 증가했습니다. 또한 [right, str_len] 인덱스 사이의 cnt 값을 증가시키고 싶지 않으므로 접두사 합계가 1만큼 증가하므로 이미 1만큼 감소시켰습니다.
4단계 − 다음으로 getPrefixSum() 함수를 실행하여 'cnt' 목록의 접두어 합계를 계산합니다.
4.1단계 − getPrefixSum() 함수에서 문자열을 순회하고 이전 요소의 값을 현재 요소에 추가합니다.
步骤 5 - 接下来,以逆序遍历'cnt'列表。如果当前元素是奇数,则将其追加到'tmp'字符串中。
步骤 6 - 用0初始化'p'와'q',按光原始顺序遍历'cnt'列表。
步骤 7 − 如果'cnt'列表中的当前 元素是奇数,则使用tmp[q]更newalpha[p]。
8단계 − 마지막으로 알파 문자열을 반환합니다.
시간 복잡도 − O(M*N + N), 여기서 O(M*N)은 쿼리에 따라 'cnt' 목록을 업데이트하고 O(N)은 주어진 문자열을 업데이트합니다.
공공间复杂degree - 使사용 'cnt' 列表为 O(N)。
현재 제1방식 중, 저는 reveres()방식을 사용하고 있습니다.转中 流现의 次数。
위 내용은 번역: M 쿼리의 경우 주어진 문자열의 범위를 반대로 바꿉니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!