1703.判断字符串的两半是否相似

题目描述

给你一个偶数长度的字符串 s 。将其拆分成长度相同的两半,前一半为 a ,后一半为 b 。

两个字符串 相似 的前提是它们都含有相同数目的元音(‘a’,‘e’,‘i’,‘o’,‘u’,‘A’,‘E’,‘I’,‘O’,‘U’)。注意,s 可能同时含有大写和小写字母。

如果 a 和 b 相似,返回 true ;否则,返回 false 。

示例

示例 1:

输入:s = “book”
输出:true
解释:a = “bo” 且 b = “ok” 。a 中有 1 个元音,b 也有 1 个元音。所以,a 和 b 相似。

示例 2:

输入:s = “textbook”
输出:false
解释:a = “text” 且 b = “book” 。a 中有 1 个元音,b 中有 2 个元音。因此,a 和 b 不相似。
注意,元音 o 在 b 中出现两次,记为 2 个。

提示

2 <= s.length <= 1000
s.length 是偶数
s 由 大写和小写 字母组成

思路

  1. 将元音都放到数组里,方便查找。(‘a’,‘e’,‘i’,‘o’,‘u’,‘A’,‘E’,‘I’,‘O’,‘U’)
  2. 确定从哪里开始分开字符串的左右两边
  3. 将字符串的左右两边各有多少元音字母计数(注意大小写都是元音)
  4. 比较两个元音字母个数,返回true或者flase

基础方法实现

JAVA实现

Java字符串
《Java编程思想》P288-289展示了String对象具备的一些基本方法
使用的方法有s.length(),s.toUpperCase(),s.substring(),s.charAt(i),Object.equals(a,b)
s.length()获取字符串s的长度
s.toUpperCase()将字符串所有字符变为大写
s.substring(起始位置,终止位置)和 s.substring(起始位置)是重载的版本;注意终止位置的字符不会被包含在内
s.charAt(i)获得s字符串第i个位置的字符;注意字符位置从0开始计算
a.equals(b),用于比较两个对象内容是否相同;注意“==”和“!=”关系操作符进行比较的是对象的引用,而不是内容;注意基本类型使用关系操作符,不能使用equals()方法,比较所有非基本类型的对象的实际内容是否相同时,必须使用equals()方法。(基本类型有Boolean,char,byte,short,int,long,float,double,void;基本类型不使用new来进行创建变量,而是创建一个非引用的变量,直接存储值,并置于堆栈中)

class Solution {
    public boolean halvesAreAlike(String s) {
        Integer i= 0;
        Integer j= 0;
        Integer leftflag = 0;
        Integer rightflag = 0;
        char tmp = '0';
        boolean ret = false;
        //1.将元音都放到数组里,方便查找。('a','e','i','o','u','A','E','I','O','U')
        char vowel[] = {'A','E','I','O','U'};
        //2.确定从哪里开始分开字符串的左右两边
        //获取字符串长度存为len
        int len = s.length();
        //将s全部改为大写
        s = s.toUpperCase();
        //3.将字符串的左右两边各有多少元音字母计数(注意大小写都是元音)
        //sleft字符串为s左半部分的子字符串,sright字符串为s右半部分的子字符串
        String sleft = s.substring(0,len/2);
        String sright = s.substring(len/2);
        for(i=0;i<sleft.length();i++)
        {
            tmp = sleft.charAt(i);
            for(j=0;j<vowel.length;j++){
                if(tmp==vowel[j]){
                    leftflag++;
                }
            }   
        }
        for(i=0;i<sright.length();i++)
        {
            tmp = sright.charAt(i);
            for(j=0;j<vowel.length;j++){
                if(tmp==vowel[j]){
                    rightflag++;
                }
            }   
        }
        //4.比较两个元音字母个数,返回true或者flase
        if(leftflag.equals(rightflag))   return true;
        else                        return false;
    }
}

Java双重循环

python实现

python3字符串
字符串不可更改,所有操作都是生成副本
使用单引号和双引号标注字符串都可以
\反斜杠用于转义字符
如果不想使用\转义,在字符串引号前面加r,这样的字符串是原始字符串
使用三重引号‘’‘……’‘’可以在字符串中包含多行
字符串可以使用+连接,使用*重复(eg.‘f’+2 * ‘o’+‘t’ 输出为foot)
相邻的字符串会自动合并(eg.‘f’ 'oot’输出 foot),只有字面值如此,变量不能自动合并,要使用+连接
字符串索引是下标,从0开始。
索引支持负数,负数是从右往左计数,负数索引从-1开始
获取子字符串使用字符串名[起始下标:终止下标]形式(eg.word=‘python’,word[0:2]=‘py’),注意这里终止下标是不被包含在内的。默认的起始下标是0
len()返回字符串长度

python3列表
列表可以支持不同类型的元素,但一般都是相同类型的元素。形式如下:squares = [1, 4, 9, 16, 25]
列表支持下标索引和切片
合并操作使用+
内容可以改变,append() 方法可以在列表中加入新元素(eg.append(111) 生成结果是squares = [1, 4, 9, 16, 25,111])
更改列表切片会使得列表改变(eg.squares[1:3]=[] 生成结果是squares = [1,16, 25,111])
可以嵌套列表(eg. a=[‘a’,‘b’,‘c’] b=[‘1’,‘2’] 则s=[a,b]为s=[[‘a’,‘b’,‘c’] ,[‘1’,‘2’]] 则s[0]=[‘a’,‘b’,‘c’] s[0][1]=‘b’)

class Solution(object):
    def halvesAreAlike(self, s):
        """
        :type s: str
        :rtype: bool
        """
        i,j = 0,0
        #1. 将元音都放到数组里,方便查找。('a','e','i','o','u','A','E','I','O','U')
        vowel = ['a','e','i','o','u','A','E','I','O','U']
        ret = False
        #2.确定从哪里开始分开字符串的左右两边
        length = len(s)
        left,right = 0,0
        # 3. 将字符串的左右两边各有多少元音字母计数(注意大小写都是元音)
        for sword in s:
            j=0
            for v in vowel:
                if s[i]==vowel[j]:  
                    if i<length//2:    left=left+1
                    if i>=length//2:   right=right+1
                j=j+1
            i=i+1
        # 4. 比较两个元音字母个数,返回true或者flase
        if left==right: ret=True
        return ret

python双重循环

C实现

C语言中,字符串是以\0结尾的一维字符数组,初始化可以写成char site[] = “RUNOOB”;
C语言提供许多字符串函数
strcpy(s1, s2);复制s2到s1
strcat(s1, s2);连接s2到s1末尾
strlen(s1);返回s1长度
strcmp(s1, s2); s1 =s2 返回 0; s1<s2 返回< 0;s1>s2 返回> 0
strchr(s1, ch);返回指向 s1 中字符‘ch’ 第一次出现的位置的指针
strstr(s1, s2);返回指向 s1 中字符串s2 第一次出现的位置的指针

bool halvesAreAlike(char * s){
    int i=0,j=0;
    int left=0,right=0;
    bool ret=false;
    //1.将元音都放到数组里,方便查找。('a','e','i','o','u','A','E','I','O','U')
    char vowel[11] = {'a','e','i','o','u','A','E','I','O','U','\0'};
    //2.确定从哪里开始分开字符串的左右两边
    int length = strlen(s);
    // 3. 将字符串的左右两边各有多少元音字母计数(注意大小写都是元音)
    for(i=0;i<length;i++)
    {
        for(j=0;j<strlen(vowel);j++)
        {
            if(s[i]==vowel[j])
            {
                if(i<length/2)  left++;
                else            right++;
            }
        }
    }
    //4. 比较两个元音字母个数,返回true或者flase
    if(left==right)     ret=true;
    return ret;

}

在这里插入图片描述

C++实现

C++支持C语言风格的字符串
C++还提供了string类,在支持C语言函数以外还增加了许多功能
初始化写法为 string s1 = “hello”; 或者string s1(“hello”);或者string s2(10, ‘a’);
连接字符串写法为 s3=s1+s2
获取字符串长度使用s.size()或s.length()
将一个字符串赋值给另一个字符串使用 s2=s1
在一个string对象后附加另一个string对象可以使用+=或者s.append() 函数
在一个string对象后附加一个字符可以使用s.push_back(‘a’)
比较两个string对象可以直接使用==,也可以使用s.compare() 方法
使用s.substr(起始位置,子串长度)来获取子串
获取字符串某一位置的字符可以使用是s[位置]也可以使用s.at(位置)
查找字符可以使用 s.find() 方法,返回值为第一个该字符的下标
从字符串末尾往前查找字符可以使用s.rfind(),返回值为最后一个该字符的下标
从字符串任意位置往后查找字符可以使用s.find_first_of(位置) 方法,不填写参数默认从0开始查找
获取str输入可以使用 getline(cin,str) 函数
使用 s.empty() 函数判断字符串是否为空
使用 s.swap() 函数交换两个字符串

public:
    bool halvesAreAlike(string s) 
    {
        int i=0,j=0;
        int left=0,right=0;
        bool ret=false;
        //1.将元音都放到数组里,方便查找。('a','e','i','o','u','A','E','I','O','U')
        string vowel = "aeiouAEIOU";
        //2.确定从哪里开始分开字符串的左右两边
        int length = s.size();
        string s1=s.substr(0,length/2);
        string s2=s.substr(length/2,length);
        // 3. 将字符串的左右两边各有多少元音字母计数(注意大小写都是元音)
            for(j=0;j<length/2;j++)
            {
                if(count(vowel.begin(),vowel.end(), s1[j]))
                {
                    left++;
                }
                if(count(vowel.begin(),vowel.end(), s2[j]))
                {
                    right++;
                }
            }
        //4. 比较两个元音字母个数,返回true或者flase
        if(left==right)
        {
            ret=true;
        }
        return ret;
    }
};

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值