문자열의 문자 수가 인접한 문자 수보다 많도록 문자열을 배열합니다.
문자열 조작은 다양한 문제 해결 시나리오에서 매우 중요합니다. 주어진 문자열의 순열은 인접한 문자 수보다 더 많은 문자 수를 최적화하기 위해 발견되었습니다. 이것은 가능한 한 많은 인접한 문자 쌍을 생성하기 위해 문자열의 문자를 재배열해야 하는 흥미로운 퍼즐입니다. 왼쪽은 오른쪽의 문자보다 작습니다. p>
방법
최대 문자 수가 바로 인접한 문자 수보다 큰 문자열 순열을 해결하는 방법에는 여러 가지가 있습니다.
방법 1 − 역추적 및 가지치기 −
방법 2 - 동적 프로그래밍 -
방법 3 - 힙 알고리즘-
방법 4 - 가지치기를 통한 사전 순서 -
방법 1: 역추적 및 가지치기
역추적 알고리즘을 사용하여 문자열의 모든 순열을 생성합니다.
각 단계에서 현재 배열에 지금까지 발견된 최대값보다 더 많은 문자가 이웃 문자보다 많은지 확인하세요.
그렇지 않다면 불필요한 계산을 피하기 위해 가지를 일찍 잘라내고 역추적하세요.
문법
으아악인접 문자보다 최대 문자 수를 더 많이 저장하세요
최종 배열 저장
인접한 문자보다 큰 문자 수를 세어보세요
업데이트 결과
다음 문자 선택
다음 위치로 역추적
선택 취소
역추적 프로세스 시작
사용된 문자 추적
알고리즘
1단계 - 빈 문자열로 max_permutation을 시작합니다.
보조 함수 역추적(현재_순열, 남은_문자)을 정의해야 합니다.
2단계 - 남은_문자수 문자열이 비어 있는 경우 -
현재 순열의 길이가 가장 큰 순열의 길이보다 긴 경우 max_permutation을 current_permutation으로 설정하세요.
반품.
3단계 - 반복하면서 나머지 각 문자를 반복합니다. c -
new_permutation을 생성하려면 current_permutation에 c를 추가하세요.
new_permutation의 길이가 1보다 크고 마지막 문자가 이전 문자보다 길지 않은 경우 이 반복을 건너뜁니다.
remaining_characters에서 c를 가져와 새로운 new_remaining을 생성합니다.
반복 호출 추적(new_permutation, new_remaining).
4단계 - 입력 텍스트를 남은_문자로, 빈 문자열을 현재_순열로 사용하여 역추적 함수를 호출합니다.
5단계 - 출력 max_permutation을 제공합니다.
예 1
이 프로그램은 먼저 입력 문자열 "abcd"를 오름차순으로 정렬하여 작동합니다. 그런 다음 가능한 각 순열은 이전 문자보다 큰 문자만 고려하여 기준을 충족하지 않는 반복 순열을 방지하는 역추적 기능을 사용하여 생성됩니다. 또한 isValidPermutation 함수는 각 문자를 이전 문자와 비교하여 평가하고 이전 문자와 같거나 작은 경우 false를 반환합니다.
결과적으로 이 의도적인 프로세스는 각 문자의 최대 수가 인접한 문자보다 높은 모든 유효한 순열을 생성합니다. 개별 요구 사항에 맞게 주어진 입력 문자열, 코드 및 논리를 자유롭게 추가로 사용자 정의할 수 있습니다.
으아악출력
으아악방법 2: 동적 프로그래밍
동적 프로그래밍을 사용하여 문자열 순열을 점진적으로 생성합니다.
빈 접두사로 시작하여 가능한 모든 위치를 고려하고 반복적으로 문자를 추가하세요.
현재 접두사의 문자 수를 인접한 문자보다 크게 유지하세요.
개수가 지금까지 발견된 최대값 아래로 떨어진 가지를 정리합니다.
문법
으아악동적 프로그래밍 루프
현재 문자가 인접한 문자보다 큰지 확인하세요
그렇다면 개수를 1
늘립니다.
그렇지 않으면 카운트가 똑같습니다
dp 배열에서 최대 개수 찾기
알고리즘
1단계 - 문자열을 입력으로 받아들이고 지정된 기준을 충족하는 가장 긴 문자열의 순열을 반환하는 maxPerm(str)이라는 함수를 만듭니다.
2단계 - 먼저 길이가 n인 배열(dp라고 함)을 초기화합니다. 여기서 n은 입력 문자열 str의 길이와 같습니다. i 위치에서 끝나는 최대 순열 문자열은 각 요소 dp[i]에 저장됩니다.
3단계 - dp[0]을 문자열 str의 첫 번째 문자로 초기화합니다.
4단계 - 인덱스 1부터 n-1 -까지 str
문자를 반복합니다.初始化一个空字符串curr来存储当前最大排列字符串。
对于索引 i 处的每个字符,将其与索引 i-1 处的前一个字符进行比较。
如果 str[i] 大于 str[i-1],将 str[i] 添加到 curr 中。
否则,将 str[i-1] 追加到 curr 中。
-
使用 dp[i-1] 和 curr 之间的最大值更新 dp[i]。
第5步 - 循环完成后,最大排列字符串将存储在dp[n-1]中。
第 6 步 - 返回 dp[n-1] 作为结果。
Example 2
的中文翻译为:示例2
在此示例中,输入字符串被硬编码为“abcbdb”。 findMaxPermutation 函数使用动态编程来计算每个索引处大于其相邻字符的最大字符数。然后,它通过回溯表来重建具有最大计数的字符串。生成的最大排列在 main 函数中打印。
#include <iostream> #include <string> #include <vector> std::string findMaxPermutation(const std::string& str) { int n = str.length(); // make a table to store the maximum count of characters // larger than their adjacent characters std::vector<std::vector<int>> dp(n, std::vector<int>(2, 0)); // Initialize the table for the base case dp[0][0] = 0; // Count when str[0] is not included dp[0][1] = 1; // Count when str[0] is included // Calculate the maximum count for each index for (int i = 1; i < n; i++) { // When str[i] is not involved, the count is the maximum // when str[i-1] is included or not dp[i][0] = std::max(dp[i-1][0], dp[i-1][1]); // When str[i] is involved, the count is the count when // str[i-1] is not included plus 1 dp[i][1] = dp[i-1][0] + 1; } // The more count will be the largest of the last two values int maxCount = std::max(dp[n-1][0], dp[n-1][1]); // Reconstruct the string with the maximum count std::string maxPerm; int i = n - 1; int count = maxCount; // Start from the end and check which character to include while (i >= 0) { if ((dp[i][0] == count - 1 && dp[i][1] == count) || (dp[i][0] == count && dp[i][1] == count)) { maxPerm = str[i] + maxPerm; count--; } i--; } return maxPerm; } int main() { std::string str = "abcbdb"; std::string maxPerm = findMaxPermutation(str); std::cout << "String: " << str << std::endl; std::cout << "Max Permutation: " << maxPerm << std::endl; return 0; }
输出
String: abcbdb Max Permutation: bbb
方法三:堆算法
实现Heap算法,高效地生成字符串的所有排列。
生成每个排列后,计算大于其相邻字符的字符数量。
保持追踪到目前为止找到的最大计数,并根据需要进行更新。
语法
function generatePermutations(string): n = length(string) characters = array of n elements initialized with string's characters generatePermutationsHelper(n, characters) function generatePermutationsHelper(n, characters): if n = 1: checkAndPrintPermutation(characters) else: for i = 0 to n-1: generatePermutationsHelper(n-1, characters) if n is even: swap characters[i] and characters[n-1] else: swap characters [0] and characters[n-1]
算法
第一步 - 已经初始化了一个数组,用于存储输入字符串的字符。
第 2 步 - 继续创建一个函数,并将其命名为“generatePermutations”,带有两个参数 - 一个最终变量“size”,用于确定数组的大小,以及一个名为“arr”的数组,其中包含字符串字符。
步骤 3 - 如果大小为 1,则通过将数组中的字符组合在一起,直到最大字符数超过连续字符数,打印当前排列。
步骤 4 - 如果不是,则函数返回。为了从索引 0 到 'size - 1' 迭代数组,我们使用一个名为 'i' 的变量。
第 5 步 - 在此迭代中,我们进一步迭代参数大小 - 1 和错误的generatePermutations 函数。
第 6 步 - 如果 size 恰好是奇数,则我们将数组中索引 0 处的元素替换为索引“size - 1”处的元素。
第 7 步 - 类似地,如果 size 结果是偶数,我们将数组中索引“i”处的元素替换为索引“size - 1”。
步骤8 - 最后,我们使用初始数组大小和数组本身作为参数调用"generatePermutations"函数。
示例 1
以下的C++示例使用Heap's算法创建字符串的排列,并识别出在其相邻字符上具有最大字符数的排列 −
为了说明问题,在这个例子中使用"abcd"作为输入字符串。可以修改变量来使用不同的输入字符串。如果排列满足具有比其邻居更多字符的要求,则找到isValidPermutation函数是否有效。generatePermutations函数使用堆栈方法来跟踪具有最多字符的排列,以便它可以生成输入字符串的每个可能的排列。主函数将最大数量和排列本身作为输出打印。
#include <iostream> #include <algorithm> using namespace std; // Function to check if the permutation satisfies the condition bool isValidPermutation(const string& perm) { int n = perm.length(); for (int i = 0; i < n - 1; i++) { if (abs(perm[i] - perm[i + 1]) <= 1) return false; } return true; } // Function to swap two characters in a string void swapChar(char& a, char& b) { char temp = a; a = b; b = temp; } // Heap's Algorithm for generating permutations void generatePermutations(string& str, int n, int& maxCount, string& maxPerm, int idx = 0) { if (idx == n - 1) { if (isValidPermutation(str)) { int count = count_if(str.begin(), str.end(), [](char c) { return isalpha(c) && c >= 'A' && c <= 'Z'; }); if (count > maxCount) { maxCount = count; maxPerm = str; } } return; } for (int i = idx; i < n; i++) { swapChar(str[idx], str[i]); generatePermutations(str, n, maxCount, maxPerm, idx + 1); swapChar(str[idx], str[i]); } } int main() { string str = "abcd"; int n = str.length(); int maxCount = 0; string maxPerm; generatePermutations(str, n, maxCount, maxPerm); if (maxCount == 0) { cout << "No valid permutation found." << endl; } else { cout << "Maximum number of characters greater than adjacent characters: " << maxCount << endl; cout << "Permutation with the maximum count: " << maxPerm << endl; } return 0; }
输出
No valid permutation found.
方法4:字典序排序与剪枝
按字典顺序对字符串的字符进行排序。
生成排序字符串的排列。
在每一步中,检查当前排列是否满足最大字符数大于其相邻字符的条件。
如果不是这样,请跳过具有相似前缀的剩余排列,以避免不必要的计算。
语法
生成字符串所有排列的函数
function generatePermutations(string):
TODO:排列生成的实现
检查字符是否大于其相邻字符的函数
function isGreaterAdjacent(char1, char2):
TODO:比较逻辑的实现
找到具有大于相邻字符的最大数量的排列的函数
function findMaxAdjacentPermutation(string):
生成字符串的所有排列
permutations = generatePermutations(string)
初始化变量
max_permutation = "" max_count = 0
遍历每个排列
for permutation in permutations: count = 0
迭代排列中的每个字符(不包括最后一个字符)
for i from 0 to length(permutation) - 2: char1 = permutation[i] char2 = permutation[i + 1]
检查当前字符是否大于其相邻字符
if isGreaterAdjacent(char1, char2): count = count + 1
检查当前排列的计数是否大于先前的最大值
if count > max_count: max_permutation = permutation max_count = count
返回具有最大计数的排列
return max_permutation
算法
第一步 - 从输入字符串开始。
第 2 步 - 按字典顺序对字符串进行排序以获得初始排列。
第 3 步 - 将变量 maxCount 初始化为 0,以跟踪大于相邻字符的最大字符数。
第 4 步 - 初始化变量 maxPermutation 以存储最大计数的排列。
第 5 步 - 当有下一个排列时 -
将变量 count 初始化为 0,以跟踪当前大于相邻字符的字符数。
对于当前排列中的每个字符 -
检查当前字符是否大于其前一个字符和后一个字符(如果存在)。
如果满足条件,则将计数增加 1。
如果计数大于最大计数(maxCount)-
将maxCount更新为当前计数。
将 maxPermutation 更新为当前排列。
步骤 6 - 将 maxPermutation 作为结果返回。
示例 1
对于此示例,为简单起见,让我们考虑固定字符串“abcde”。
在这个例子中,countAdjacentGreater函数统计字符串中相邻字符大于其前一个字符的数量。findMaxPermutation函数生成输入字符串的所有排列,并检查每个排列,找出具有最大数量相邻字符大于的那个。
主要函数初始化输入字符串"abcde"和跟踪最大计数和最大排列的变量。它调用findMaxPermutation函数来找到最大排列。
#include <iostream> #include <algorithm> #include <string> using namespace std; int countAdjacentGreater(const string& str) { int count = 0; for (int i = 0; i < str.length() - 1; i++) { if (str[i] < str[i + 1]) { count++; } } return count; } void findMaxPermutation(string& str, int& maxCount, string& maxPerm) { sort(str.begin(), str.end()); do { int count = countAdjacentGreater(str); if (count > maxCount) { maxCount = count; maxPerm = str; } } while (next_permutation(str.begin(), str.end())); } int main() { string str = "abcde"; int maxCount = 0; string maxPerm; findMaxPermutation(str, maxCount, maxPerm); cout << "String with the maximum number of characters greater than its adjacent characters: " << maxPerm << endl; cout << "Count of adjacent characters greater in the maximum permutation: " << maxCount << endl; return 0; }
输出
String with the maximum number of characters greater than its adjacent characters: abcde Count of adjacent characters greater in the maximum permutation: 4
结论
总之,找到最大字符数大于相邻字符的字符串的排列问题是字符串操作中的一个有趣的挑战。通过分析给定的字符串并有策略地重新排列其字符,可以实现所需的排列。这个问题凸显了在使用字符串和排列时仔细检查和创造性思维的重要性。
위 내용은 문자열의 문자 수가 인접한 문자 수보다 많도록 문자열을 배열합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











C 언어 데이터 구조 : 트리 및 그래프의 데이터 표현은 노드로 구성된 계층 적 데이터 구조입니다. 각 노드에는 데이터 요소와 하위 노드에 대한 포인터가 포함되어 있습니다. 이진 트리는 특별한 유형의 트리입니다. 각 노드에는 최대 두 개의 자식 노드가 있습니다. 데이터는 structtreenode {intdata; structtreenode*왼쪽; structReenode*오른쪽;}을 나타냅니다. 작업은 트리 트래버스 트리 (사전 조정, 인 순서 및 나중에 순서) 검색 트리 삽입 노드 삭제 노드 그래프는 요소가 정점 인 데이터 구조 모음이며 이웃을 나타내는 오른쪽 또는 무의미한 데이터로 모서리를 통해 연결할 수 있습니다.

파일 작동 문제에 대한 진실 : 파일 개방이 실패 : 불충분 한 권한, 잘못된 경로 및 파일이 점유 된 파일. 데이터 쓰기 실패 : 버퍼가 가득 차고 파일을 쓸 수 없으며 디스크 공간이 불충분합니다. 기타 FAQ : 파일이 느리게 이동, 잘못된 텍스트 파일 인코딩 및 이진 파일 읽기 오류.

기사는 Move Semantics, Perfect Forwarding 및 Resource Management에 대한 C에서 RValue 참조의 효과적인 사용에 대해 논의하여 모범 사례 및 성능 향상을 강조합니다 (159 자).

C 20 범위는 표현성, 합성 가능성 및 효율성으로 데이터 조작을 향상시킵니다. 더 나은 성능과 유지 관리를 위해 복잡한 변환을 단순화하고 기존 코드베이스에 통합합니다.

C 언어 기능은 코드 모듈화 및 프로그램 구축의 기초입니다. 그들은 선언 (함수 헤더)과 정의 (기능 본문)로 구성됩니다. C 언어는 값을 사용하여 기본적으로 매개 변수를 전달하지만 주소 패스를 사용하여 외부 변수를 수정할 수도 있습니다. 함수는 반환 값을 가질 수 있거나 가질 수 있으며 반환 값 유형은 선언과 일치해야합니다. 기능 명명은 낙타 또는 밑줄을 사용하여 명확하고 이해하기 쉬워야합니다. 단일 책임 원칙을 따르고 기능 단순성을 유지하여 유지 관리 및 가독성을 향상시킵니다.

이 기사는 C에서 Move Semantics를 사용하여 불필요한 복사를 피함으로써 성능을 향상시키는 것에 대해 논의합니다. STD :: MOVE를 사용하여 이동 생성자 및 할당 연산자 구현을 다루고 효과적인 APPL을위한 주요 시나리오 및 함정을 식별합니다.

이 기사는 C의 동적 파견, 성능 비용 및 최적화 전략에 대해 설명합니다. 동적 파견이 성능에 영향을 미치는 시나리오를 강조하고이를 정적 파견과 비교하여 성능과 성능 간의 트레이드 오프를 강조합니다.

C35의 계산은 본질적으로 조합 수학이며, 5 개의 요소 중 3 개 중에서 선택된 조합 수를 나타냅니다. 계산 공식은 C53 = 5입니다! / (3! * 2!)는 효율을 향상시키고 오버플로를 피하기 위해 루프에 의해 직접 계산할 수 있습니다. 또한 확률 통계, 암호화, 알고리즘 설계 등의 필드에서 많은 문제를 해결하는 데 조합의 특성을 이해하고 효율적인 계산 방법을 마스터하는 데 중요합니다.
