题目如下:
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;
}
哇,兴奋到掀桌子。为什么这么棒啊?
分析一下,相当于一个字符串,前后各有一个指针,一个在向后判断,一个在向前判断,跳过非字母元素,直接判断是否为会为回文,妙,妙啊。