LeetCode-License_Key_Formatting

题目:

You are given a license key represented as a string S which consists only alphanumeric character and dashes. The string is separated into N+1 groups by N dashes.

Given a number K, we would want to reformat the strings such that each group contains exactly K characters, except for the first group which could be shorter than K, but still must contain at least one character. Furthermore, there must be a dash inserted between two groups and all lowercase letters should be converted to uppercase.

Given a non-empty string S and a number K, format the string according to the rules described above.

Example 1:

Input: S = "5F3Z-2e-9-w", K = 4

Output: "5F3Z-2E9W"

Explanation: The string S has been split into two parts, each part has 4 characters.
Note that the two extra dashes are not needed and can be removed.

Example 2:

Input: S = "2-5g-3-J", K = 2

Output: "2-5G-3J"

Explanation: The string S has been split into three parts, each part has 2 characters except the first part as it could be shorter as mentioned above.

Note:

  1. The length of string S will not exceed 12,000, and K is a positive integer.
  2. String S consists only of alphanumerical characters (a-z and/or A-Z and/or 0-9) and dashes(-).
  3. String S is non-empty.

翻译:

你被给定一个用字符串 S 表示的只包含字母字符和中划线的序列码。这个字符串被 N 个中划线分成 N+1 个组。

给定一个数字 K ,我们想要将这个字符串格式化为每一组包含 K 个字符,除了第一组可能包含少于 K 个字符,但是必须包含至少1个字符。除此之外,每两组之间必须用中划线分隔并且所有的小写字母都要转换为大写格式。

给定一个非空的字符串 S 和一个数字 K ,根据以上规则格式化字符串。

例子 1:

输入: S = "5F3Z-2e-9-w", K = 4

输出: "5F3Z-2E9W"

解释: 字符串 S 被分为2个部分,每个部分含有4个字符。
两个多余的中划线是不需要的可以被移除。

例子 2:

输入: S = "2-5g-3-J", K = 2

输出: "2-5G-3J"

解释: 字符串 S 被分为3个部分,每个部分有两个字符除了第一个部分,因为根据上面提到的,它可以比较短。

注意:

  1. 字符串 S 的长度不超过12,000,并且 K 是一个正数。
  2. 字符串 S 只包含字母字符(a-z 或 A-Z 或 0-9)和中划线(-)。
  3. 字符串 S 是不空的。


思路:

这道题的主要难点在于如何控制第一个部分的个数,使得第一部分包含字母个数小于等于K,而后面的其他部分正好等于K。于是我们将字符串倒过来考虑,从后往前放。先满足后面都等于K,剩下的部分自然小于或等于K了。最后再把得到的结果反转过来即为所求。


C++代码(Visual Studio 2017):

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

class Solution {
public:
	string licenseKeyFormatting(string S, int K) {
		string res;
		for (auto i = S.rbegin(); i < S.rend(); i++) {
			if (*i != '-') {
				if (res.size() % (K + 1) == K)
					res += '-';
				res += toupper(*i);
			}	
		}
		reverse(res.begin(), res.end());
		return res;
	}
};

int main()
{
	Solution s;
	string S="2-5g-3-J";
	int K=2;
	string result;
	result = s.licenseKeyFormatting(S, K);
	cout << result;
    return 0;
}

阅读更多

没有更多推荐了,返回首页