Leetcode题目_2

题目如下:

Given a string, determine if it is a palindrome, considering only alphanumeric characters

and ignoring cases.

For example,

"A man, a plan, a canal: Panama" is a palindrome.

"race a car" is not a palindrome.


先写一个如何判断回文的方法:

string huiwen = "1111B2Ba345B";
void IsHuiwen()
{
	 m_size = huiwen.length();
	
	for (int i = 0; i< m_size;i++)
	{
	
		if (huiwen[i] != huiwen[m_size - i-1])
		{
			//cout << "不是回文" << endl;
			flag += 1;
			break;
		}
		else
		{
			flag = 0;
		}
	}
	if (flag == 0)
		cout << "是回文" << endl;
	else
		cout << "不是回文";
	cin.get();

}

和朋友交流后,发现我的代码有以下缺点

1,有一半的无用循环次数

2,控制程序结果输出一次时,多余的定义了flag  // 后来发现,必须要设置flag控制输出判断结果

3,string在全局范围内定义,没有函数参数传入方便

4,没搞懂string 和 char的区别

关于第四点,在此博客(转载)中有详细的解释和区分 https://blog.csdn.net/u013834525/article/details/82533935

此博客(转载)中有c++中对字符串进行插入、替换、删除的操作https://www.cnblogs.com/cxchanpin/p/6950399.html

      简单的总结一下,String是个封装好的类,Char像Int一样是基础数据类型。String中有写好的方法接口来实现增删替换,如insert(); replace(); erase(); ;而Char就像数组一样,需要我们自己遍历实现增删


对已有的回文判断程序改进

void IsHuiwen(string str)
{
	m_size = str.length();

	for (int i = 0; i < (m_size/2);i++)
	{

		if (str[i] != str[m_size - i - 1])
		{
		cout << "不是回文" << endl;
		flag = false;
		break;
		}
	
	}

	if (flag==true)
		cout << "是回文" << endl;

	cin.get();

}

在写用字符串作为传递参数时,我突然想到了使用指针和使用引用传递参数的区别

该微博(转载)中有相关说明 

https://www.cnblogs.com/gxcdream/p/4805612.html

https://blog.csdn.net/e295166319/article/details/75108086


如果不使用 string 而是使用char ,单纯的判断回文程序如下

#include<iostream>
using namespace std;
int main()
{
    char str[100];
    int len = 0;
    bool flag = true;
    cout << "请任意输入一串字符" << endl;
    int i = 0;
    str[i] = getchar();
    while (str[i] != '\n')
    {
        i++;
        str[i] = getchar();
    }
    len = i - 1;
    for (int j = 0; j < (len / 2); j++)
    {
        if (str[j] != str[len - j])
        {
            flag = false;
            break;
        }
    }
    if (false == flag)
    {
        cout << "不是回文" << endl;
    }
    else
    {
        cout << "是回文" << endl;
    }
    system("pause");
    return 0;
}
--------------------- 
作者:aiting23 
来源:CSDN 
原文:https://blog.csdn.net/baidu_36856113/article/details/58588861 
版权声明:本文为博主原创文章,转载请附上博文链接!

      继续原程序的书写,我的思路是:先用循环遍历字符串中每一个字符,如果是字母,就复制到另一个字符串里,如果不是无操作。然后对只有字符的字符串做判断回文操作。以实现,忽略符号和数字的效果。实现程序如下:

#include<iostream>
using namespace std;


string huiwen = "A2BaB4A!";
bool flag = true;
int m_size;
string clean_huiwen = huiwen;

void Clean()
{
	for (int i = 0; i < clean_huiwen.length();i++)
	{
		if (!(((clean_huiwen[i] >= 'a') && (clean_huiwen[i] <= 'z')) || ((clean_huiwen[i] >= 'A') && (clean_huiwen [i] <= 'Z'))))
		{
			clean_huiwen.erase(i,1);
		}

	}

}

void show_array(string str)
{
	for (int i = 0; i < str.length();i++)
	{
		cout << str[i] << endl;
	}

}

void IsHuiwen(string str)
{
	m_size = str.length();

	for (int i = 0; i < (m_size/2);i++)
	{

		if (str[i] != str[m_size - i - 1])
		{
		cout << "不是回文" << endl;
		flag = false;
		break;
		}
	
	}

	if (flag==true)
		cout << "是回文" << endl;

//	cin.get();

}

int main()
{
	
	Clean();
	show_array(clean_huiwen);
	IsHuiwen(clean_huiwen);
	cin.get();
	return 0;
}

以上就是我的笨方法。复杂度为 O(2n) 

另外需要注意的是string风格字符串,初始声明时,必须不为空。也就是说,必须一开始就赋值。

标准C++库字符串类std::string的用法 
/#include 
std::string s1; 
std::string s3(s2); 
std::string s2(“this is a string”); 
begin 得到指向字符串开头的Iterator 
end 得到指向字符串结尾的Iterator 
rbegin 得到指向反向字符串开头的Iterator 
rend 得到指向反向字符串结尾的Iterator 
size 得到字符串的大小 
length() 和size函数功能相同 
max_size 字符串可能的最大大小 
capacity 在不重新分配内存的情况下,字符串可能的大小 
empty 判断是否为空 
operator[] 取第几个元素,相当于数组 
c_str 取得C风格的const char* 字符串 
data 取得字符串内容地址 
operator= 赋值操作符 
reserve 预留空间 
swap 交换函数 
insert 插入字符 
append 追加字符 
push_back 追加字符 
erase 删除字符串 
clear 清空字符容器中所有内容 
resize 重新分配空间 
assign 和赋值操作符一样 
replace 替代 
copy 字符串到空间 
find 查找,返回基于0的索引号 
rfind 反向查找 
find_first_of 查找包含子串中的任何字符,返回第一个位置 
find_first_not_of 查找不包含子串中的任何字符,返回第一个位置 
find_last_of 查找包含子串中的任何字符,返回最后一个位置 
find_last_not_of 查找不包含子串中的任何字符,返回最后一个位置 
substr(n1,len) 得到字符串从n1开始的长度为len的子串 
比较字符串(支持所有的关系运算符) 
compare 比较字符串 
operator+ 字符串链接 
operator+= += 操作符 
operator== 判断是否相等 
operator!= 判断是否不等于 
operator< 判断是否小于 
operator>> 从输入流中读入字符串 
operator<< 字符串写入输出流 
getline 从输入流中读入
--------------------- 
作者:哀酱 
来源:CSDN 
原文:https://blog.csdn.net/u010821666/article/details/77934510 
版权声明:本文为博主原创文章,转载请附上博文链接!


既然string和char各有不同的用法,那么,应该怎样转换呢?

该博客(转载)中有相关说明https://www.cnblogs.com/devilmaycry812839668/p/6353807.html


拓展就到这里了,学习一下《CleanCodeHandbook》中对leetcode中题目是怎么实现的

public boolean isPalindrome(String s)
 {
int i = 0, j = s.length() - 1;
while (i < j) 
 {
while (i < j && !Character.isLetterOrDigit(s.charAt(i))) 
    i++;
while (i < j && !Character.isLetterOrDigit(s.charAt(j))) 
    j--;
if (Character.toLowerCase(s.charAt(i))!= Character.toLowerCase(s.charAt(j)))
  {
return false;
  }
i++; j--;
 }
return true;
}

哇,兴奋到掀桌子。为什么这么棒啊?

分析一下,相当于一个字符串,前后各有一个指针,一个在向后判断,一个在向前判断,跳过非字母元素,直接判断是否为会为回文,妙,妙啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值