cincdx

cincdx

String Expansion

Link: https://ac.nowcoder.com/acm/problem/16644
Source: Nowcoder

#include<bits/stdc++.h>
using namespace std;
string solve(char b,char e,int p1,int p2,int p3)
{
	if(e-b==1)return "";
	if(!(isalpha(b)&&isalpha(e)&&b<e||isdigit(b)&&isdigit(e)&&b<e))
	 return "-";
	string ans="";
	for(char i=b+1;i<e;i++)
	{
		for(int j=1;j<=p2;j++)
		{
			ans+=i;
		}
	}
	if(p1==2&&isalpha(b))
	{
		for(int i=0;i<ans.length();i++)
		{
			ans[i]=ans[i]-'a'+'A';
		}
	}
	if(p1==3)
	{
		for(int i=0;i<ans.length();i++)
		ans[i]='*';
	}
	if(p3==2){
		reverse(ans.begin(),ans.end());
	}
	return ans;
}
int main()
{
	int p1,p2,p3;
	cin>>p1>>p2>>p3;
	string a;
	cin>>a;
	string ans="";
	for(int i=0;i<a.length();i++)
	{
		if(a[i]=='-'&&i-1>=0&&i+1<a.length())
		{
			ans+=solve(a[i-1],a[i+1],p1,p2,p3);
		}
		else 
		{
			ans+=a[i];
		}
	}
	cout<<ans<<endl;
	return 0;
}
  1. Find that when encountering '-', the string will be expanded, so we can consider encapsulating a function.
  2. Traverse the string. My method is to move it backwards, but this is obviously very troublesome, and the complexity increases when calculating the length of the interval. The best way is to create another string 'ans' to store the answer.
    • If a[i] is not '-', add it directly to 'ans'.
    • If it is '-', add the expanded string to 'ans'.
  3. How to expand? First, exclude illegal cases:
    • The first illegal case is "a-b" -> "ab", "2-3" -> "23", in this case, regardless of whether it is a letter or a number, it can be understood as: the character after it is 1 greater than the character before it, that is, e-b == 1. In this case, return an empty string "" (e represents the character before '-', b represents the character after '-').
    • "Both sides of the minus sign are lowercase letters or numbers, and according to the order of ASCII codes, the character to the right of the minus sign is strictly greater than the character to the left." Start from the opposite side, the positive situation is complicated, the letter before the number, the number before the letter, it's almost the same.
      Then write the 'ans':
    for(char i=b+1;i<e;i++)
    {
    	for(int j=1;j<=p2;j++)
    	{
    		ans+=i;
    	}
    }
    
	This loop is very clever. The first layer solves which character, and the second layer solves how many characters.
	
	Then, when p1=2 and it is a letter, change the lowercase letters in 'ans' to uppercase letters. The uppercase letters don't need to be changed, and you can use the function toupper here (note that you must judge whether it is a letter here, I made a mistake here and got a wrong answer).
	p1=3 doesn't matter.
	Finally, reverse it directly using the function reverse.
The above code is wrong, 1. The '-' at the beginning and end, such as "-a-d-"
```c++
if(a[i]=='-'&&i-1>=0&&i+1<a.length())
		{
			ans+=solve(a[i-1],a[i+1],p1,p2,p3);
		}

Consideration of special cases

  1. The '-' at the beginning and end, such as "-a-d-"
  2. Continuous '-', such as "---" This line of code solves this problem
(isalpha(b)&&isalpha(e)&&b<e||isdigit(b)&&isdigit(e)&&b<e))
  1. The '-' between numbers and letters, such as "1-a"
  2. The character on the left of '-' is greater than the one on the right, such as "d-a"
Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.