C语言解决左移问题

C语言解决左移问题_第1张图片图2.1主方法

首先用户先输入一串字符串,表现为:

string str;

    cout << "请输入字符串: ";

    cin >> str;

其次使用贪心算法来优化字符串,使得相邻字符的ASCII码之差的最小值最大因此调用到函数greedyOptimize(str);

然后初始化 maxMinDiff 为 INT_MIN (整型最小值),用于记录经过左移操作后能得到的相邻字符ASCII码之差的最大最小值,同时定义 bestShiftedStr 用于保存能达到这个最大最小值时对应的左移后的字符串。

通过一个 for 循环,对经过贪心优化后的字符串进行不同步数(从0到字符串长度减1)的左移操作(调用 leftShift 函数),每次左移后调用 minDiff 函数计算左移后字符串相邻字符ASCII码之差的最小值,然后与当前记录的最大最小值( maxMinDiff )进行比较,如果当前计算的最小值更大,就更新 maxMinDiff 和 bestShiftedStr ,记录下这个更大的最小值以及对应的左移后的字符串。

最后,输出经过左移操作后使得相邻字符ASCII码之差最小值最大的字符串以及这个最小值的具体数值,程序正常结束返回0。

greedyOptimize(str); 算法如图2.2所示。

C语言解决左移问题_第2张图片图2.2贪心算法优化字符串函数

设置一个布尔型的变量optimized用来控制while循环,当optimized为false时进入循环,当optimized为true是退出循环。

 在每次循环开始时,先将 optimized 设为 true ,表示假设当前字符串已经是优化好的状态了,然后通过循环遍历字符串 i < s.size() - 1 ,去查找是否有相邻且相同的字符 s[i] == s[i + 1] 。如果找到了,并且这两个相同字符的位置不是在字符串开头( i > 0 ),就使用 swap 函数交换当前相同字符中的后一个字符s[i] 和它前面的字符s[i - 1] ,同时将 optimized 设为 false ,表示还没优化完成,然后直接 break 跳出内层循环,继续下一轮的整体优化尝试,直到遍历完整个字符串都没有可交换的相同相邻字符了,就认为优化完成,最后返回优化后的字符串。C语言解决左移问题_第3张图片

图2.3左移操作和计算ASCII码值

左移操作接受一个字符串 s 和一个整数 n 作为参数,表示左移的位数。并通过 substr 函数将字符串从第 n 个位置开始到末尾的子串 s.substr(n) 和从开头到第 n 个位置的子串 s.substr(0, n) 进行拼接,实现将原字符串整体左移 n 位的效果,最后返回左移后的新字符串。

minDiff函数是计算给定字符串中相邻字符ASCII码之差的最小值。首先将 minDiffVal 初始化为 INT_MAX ,表示一个很大的值,方便后续比较更新找到真正的最小值。然后通过循环遍历字符串中除了最后一个字符之外的每个字符 i < s.size() - 1 ,计算当前字符和下一个字符ASCII码差值的绝对值abs(s[i] - s[i + 1]) ,并使用 min 函数不断更新 minDiffVal ,使其始终保持是已遍历到的差值中的最小值,最后返回这个最小值。

你可能感兴趣的:(c++,c#)