字符串问题—其五

判断两个字符串是否互为变形词

题目

给定两个字符串s1和s2,如果s1和s2中出现的字符种类一样且每种字符出现的次数也一样,那么s1和s2互为变形词。请事先函数判断两个字符串是否互为变形此。

代码

用一哈希表来进行记录各词出现概率即可

#include<iostream>
#include<string>
using namespace std;

bool isDeformation(string s1, string s2)
{
	if (s1.size() < 1 || s2.size() < 1 || s1.size() != s2.size())
		return false;
	int len1 = s1.size();
	int len2 = s2.size();
	int *table = new int[256];  //int* table = new int[len]申请字符个数长度的表是不行的
	for (int i = 0; i < 256; i++)
		table[i] = 0;
	for (int i = 0; i < len1; i++)
		table[s1[i]]++;
	for (int i = 0; i < len2; i++)
	{
		if (table[s2[i]]-- < 0)
			return false;
	}
	return true;
}

int main()
{
	string str1, str2;
	getline(cin, str1);
	getline(cin, str2);
	bool res = isDeformation(str1, str2);
	if (res)
		cout << "Right!" << endl;
	else
		cout << "Wrong!" << endl;
	getchar();
	return 0;
}

字符串中数字子串的求和

题目

给定一个字符串str,求其中全部数字串所代表的数字之和
要求:忽略小数点字符,例如A1.3,其中包含两个数字1和3;
如果紧贴数字子串的左侧出现字符‘-’,当连续出现的数量为奇数时,则数字视为负,连续出现的数量为偶数时,则数字视为正。

代码

#include<iostream>
#include<string>
using namespace std;

int sum(string s)
{
	if (s.size() < 1)
		return 0;
	int sum = 0;
	int len = s.size();  //需要多设置几个变量
	int num = 0;
	bool pos = true;
	int cur = 0;
	for (int i = 0; i < len; i++)
	{
		cur = s[i] - '0';
		if (cur < 0 || cur > 9)
		{
			sum += num;
			num = 0;
			if (s[i] == '-')
			{
				if (i - 1 > -1 && s[i] == '-')
					pos = !pos;
				else
					pos = false;
			}
			else
				pos = true;
		}
		else
			num = num * 10 + (pos ? cur : -cur);
	}
	sum += num;
	return sum;
	//主要的问题是在符号转换的位置稍微复杂,自己一下子无法得到正确的转换方式
}

int main()
{
	string s;
	getline(cin, s);
	int res = sum(s);
	cout << res << endl;
	getchar();
	return 0;
}

去掉字符串中连续出现k个0的子串

题目

给定一个字符串str和一个整数k,如果str中正好有连续的k个‘0’字符出现是,把k个连续的‘0’字符去除,返回处理后的字符串。

代码

#include<iostream>
#include<string>
using namespace std;

string removeKZeros(string &s, int k)
{
	if (s.size() < 1)
		return "";
	int len = s.size();
	string copyS = s;
	int count = 0;
	int start = -1;
	int numKzero = 0;
	for (int i = 0; i < len; i++)
	{
		if (s[i] == '0')
		{
			count++;
			start = start == -1 ? i : start;
		}
		else
		{
			if (count == k)
			{
				/*while (count-- != 0)
					s[start++] = 0;*/
				copyS.erase(start - numKzero * k, k);
				numKzero++;
			}
			start = -1;
			count = 0;
		}
	}
	if (count == k)
	{
		/*while (count-- != 0)
			s[start++] = 0;*/
		copyS.erase(start - numKzero * k, k);
	}
	return copyS;
}

int main()
{
	string s;
	getline(cin, s);
	int k;
	cin >> k;
	string res = removeKZeros(s, k);
	cout << res << endl;
	getchar();
	return 0;
}
/*有个问题就是如果按照java的格式来设置,原来的字符'0'删除之后空下的位置会变空,但是位置依旧在,所以做了简单的修改*/

判断两个字符串是否互为旋转词

题目

如果一个字符串str,把字符串str前面任意的部分挪到后面形成的字符串叫做str的旋转词。如果str=“12345”,那么“12345”,“23451”,“34512”,“45123”和“51234”为str的旋转词。给定两个字符串a和b,请判断a和b是否互为旋转词。
要求:如果a和b的长度不一样,那么a和b必然不互为旋转词,可以直接返回false。当a和b长度一样,都为N时,要求时间复杂度为O(N).

代码

#include<iostream>
#include<string>
using namespace std;

//要求时间复杂度为O(N)的解法
int* getNextArray(char* ms, int len)
{
	if (len == 1)
		return new int[1]{ -1 };
	int* next = new int[len];
	next[0] = -1;
	next[1] = 0;
	int pos = 2;
	int cn = 0;
	while (pos < len)
	{
		if (ms[pos - 1] == ms[cn])
			next[pos++] = ++cn;
		else if (cn > 0)
			cn = next[cn];
		else
			next[pos++] = 0;
	}
	return next;
}

//KMP
int getIndexOf(string s, string m)
{
	if (s == "" || m == "" || m.size() < 1 || s.size() < m.size())
		return -1;
	int lens = s.size();
	int lenm = m.size();
	char* sc = (char*)malloc(sizeof(char) * lens);
	char* mc = (char*)malloc(sizeof(char) * lenm);
	memcpy(sc, s.c_str(), sizeof(char) * lens);
	memcpy(mc, m.c_str(), sizeof(char) * lenm);
	int mi = 0, si = 0;
	int* next = getNextArray(mc, lenm);
	while (si < lens && mi < lenm)
	{
		if (sc[si] == mc[mi])
		{
			si++;
			mi++;
		}
		else if (next[mi] == -1)
			si++;
		else
			mi = next[mi];
	}
	return mi == lenm ? si - mi : -1;
}//说起来现在KMP还是迷糊的

bool isRotation(string a, string b)
{
	if (a.size() < 1 || b.size() < 1 || a.size() != b.size())
		return false;
	string b2 = b + b;
	return getIndexOf(b2, a) != -1;
}

int main()
{
	string a, b;
	getline(cin, a);
	getline(cin, b);
	bool res = isRotation(a, b);
	if (res)
		cout << "String a is a rotation of b." << endl;
	else
		cout << "String a is not a rotation of b." << endl;
	getchar();
	return 0;
}

将整数字符串转成整数值

题目

给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str代表的整数值,否则返回0.

代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

bool isValid(string s)
{
	if (s[0] != '-' && (s[0] < '0' || s[0] > '9'))
		return false;
	if (s[0] == '-' && (s.size() == 1 || s[1] == '0'))
		return false;
	if (s[0] == '0' && s.size() > 1)
		return false;
	int len = s.size();
	for (int i = 1; i < len; i++)
		if (s[i] < '0' || s[i] > '9')
			return false;
	return true;
}

int strToNumCore(char* s, int flag)
{
	int num = 0;
	while (*s != '\0')
	{
		if (*s >= '0' && *s <= '9')
		{
			cur = *s - '0';
			if ((num > minq) || (num == minq && cur > minr))
			{
				num = 0;
				break;
			}
			num = num * 10 + cur;
			s++;
		}
		else
		{
			num = 0;
			break;
		}
	}
	return flag * num;
}

int charToNum(string s)
{
	if (!isValid(s))
		return 0;
	int len = s.size();
	char *str = new char[len + 1];
	strcpy(str, s.c_str());
	int flag = 0;
	if (*str != '-')
		flag = 1;
	else
	{
		flag = -1;
		str++;
	}
	int res = strToNumCore(str, flag);
	return res;
}

int main()
{
	string s;
	getline(cin, s);
	int num = charToNum(s);
	cout << num << endl;
	getchar();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值