列表

详情


KS6. 字符串长度最大乘积

描述

已知一个字符串数组words,要求寻找其中两个没有重复字符的字符串,使得这两个字符串的长度乘积最大,输出这个最大的乘积。如:
words=["abcd","wxyh","defgh"], 其中不包含重复字符的两个字符串是"abcd"和"wxyh",则输出16
words=["a","aa","aaa","aaaa"], 找不到满足要求的两个字符串,则输出0

数据范围:输入的字符串长度满足 ,保证只包含小写字母

输入描述

Input:

["a","ab","abc","cd","bcd","abcd"]

输出描述

Output:

4

示例1

输入:

["a","ab","abc","cd","bcd","abcd"]

输出:

4

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-08-27

#include<stdio.h>
int main(void)
{
    char datain[100][50];
    int len[100],Len[100*(100-1)/2][3];
    int n=0,ans=0,count=0,mid,flag;
    getchar();//[
    do
    {
        if(getchar()==']') {printf("0");return 0;}//"
        len[n] = 0;
        do
        {
            datain[n][len[n]] = getchar();
            len[n]++;
        }while(datain[n][len[n]-1]!='\"');
        len[n]--;
        datain[n][len[n]] = '\0';
        for(int i=n-1;i>=0;i--){
            Len[count][0] = len[n]*len[i];
            Len[count][1] = n;
            Len[count][2] = i;
            count++;
        }
        n++;
    }while(getchar()!=']');
    for(int i=0;i<count;i++){
        for(int j=i;j>0;j--){
            if(Len[j][0]>Len[j-1][0]){
                mid = Len[j][0];
                Len[j][0] = Len[j-1][0];
                Len[j-1][0] = mid;
                mid = Len[j][1];
                Len[j][1] = Len[j-1][1];
                Len[j-1][1] = mid;
                mid = Len[j][2];
                Len[j][2] = Len[j-1][2];
                Len[j-1][2] = mid;
            }
        }
    }
    for(int i=0;i<count;i++){
        flag = 0;
        for(int j=0;j<len[Len[i][1]];j++){
            for(int k=0;k<len[Len[i][2]];k++){
                if(datain[Len[i][1]][j]==datain[Len[i][2]][k]){
                    flag = 1;
                    break;
                }
            }
            if(flag==1) break;
        }
        if(flag==0){
            ans = Len[i][0];
            break;
        }
    }
    printf("%d",ans);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 224KB, 提交时间: 2019-08-28

#include<stdio.h>
#include<string.h>
int main()
{
    int bijiao(char *s,char *p);
    int max(int *s,int n);
    char input[10][10];
    int j=0,start=0;
    char c[20];
    int sum[100]={};
    int len[50];
    int z=0,flag=0;
    int summ=0;
    scanf("%s",c);
    for(int i=0;i<strlen(c);i++)
    {
        if(*(c+start)=='"')
        {
            start++;
            if(*(c+start)=='"')
            {
                input[j][0]='\0';
                j++;
                flag=1;
                z=0;
            }        
            while(*(c+start)!='"')
            {
                input[j][z]=*(c+start);
                start++;
                z++;
                flag=0;
            }
            if(flag==0)
            {
                input[j][z]='\0';
                j++; 
            }   
            z=0;   
        }
        start++;
    }
    for(int i=0;i<j;i++)
    {
        len[i]=strlen(*(input+i));
    }      
    for(int i=0;i<j-1;i++)
    {
        for(int z=i+1;z<j;z++)
        {           
            if(bijiao(*(input+i),*(input+z)))
            {
                sum[summ]=len[i]*len[z];
                summ++;
            }
        }      
    }
    printf("%d\n",max(sum,summ));
    return 0;
}
int bijiao(char *s,char *p)
{
    int success=1;
    for(int i=0;i<strlen(s);i++)
    {
        for(int j=0;j<strlen(p);j++)
        {
            if(*(s+i)==*(p+j))
            {        
                success=0;
            }
        }
    }
     return success;
}
int max(int *s,int n)
{
    int max=s[0];
    for(int i=1;i<n;i++)
    {
        if(*(s+i)>max)
        {
            max=*(s+i);
        }
    }
    return max;
}

C 解法, 执行用时: 2ms, 内存消耗: 344KB, 提交时间: 2021-09-18

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int cmpchar(const void*a,const void*b)
{
    return *(char*)a- *(char*)b;
}

int cmpint(const void*a,const void*b)
{
    return *(int*)b- *(int*)a;
}

int main()
{
    char* cc = (char*)malloc(sizeof(char)*100);
    char** c = (char**)malloc(sizeof(char*)*100);
    c[0] = (char*)malloc(sizeof(char)*100);
    int len1=0,len2=0,len=0;
    int num=0,t=0;
    int* length = (int*)malloc(sizeof(int)*100000);
    scanf("%s",cc);
    len = strlen(cc);
    for(int i=0;i<len;)
    {
        if(cc[i] == '[' || cc[i] == ']' || cc[i] == '"' || cc[i] == ',')
        {
            i++;
            continue;
        }
        int l=0;
        while(cc[i] != '[' && cc[i] != ']' && cc[i] != '"' && cc[i] != ',')
        {
            c[num][l++] = cc[i];
            i++;
        }
        num++;
        c[num] = (char*)malloc(sizeof(char)*100);
    }
    for(int i=0;i<num-1;i++)
    {
        for(int j=i+1;j<num;j++)
        {
            len1 = strlen(c[i]);
            len2 = strlen(c[j]);
            qsort(c[i],len1,sizeof(char),cmpchar);
            qsort(c[j],len2,sizeof(char),cmpchar);
            if(c[i][0] > c[j][len2-1] ||c[i][len1-1] < c[j][0])
            {
                length[t++] = (len1*len2);
            }
            else
                continue;
        }
    }
    qsort(length,t,sizeof(int),cmpint);
    printf("%d",length[0]);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 348KB, 提交时间: 2020-03-11

#include<stdio.h>
#include<string.h>
#define more(x,y) x>y?x:y
int cmp(char s[],char p[])
{
    int success=1;
    for(int i = 0;i < strlen(s);i++)
    {
        for(int j=0;j< strlen(p);j++)
        {
            if(s[i] == p[j])
            {       
                success=0;
                break;
            }
        }
    }
     return success;
}
int main()
{
    char input[10][10];
    int j = 0;
    char s[50];
    int len[50];
    int max = 0;
    scanf("%s",s);
    for(int i = 0;i < strlen(s);i++)
    {
        if(s[i] == '[')
            continue;
        else if(s[i] == ']')
            break;
        else if(s[i] == '"'){
            if(s[i+1] != ',' && s[i+1] != ']'){
                int k;
                for(k = 1;s[i+k] != '"';k++){
                    input[j][k-1] = s[i+k];
                }
                input[j][k-1] = '\0';
                i = i+k;
                j++;
            }
            else if(s[i+1] == ',')
                i++;
            else
                break;
        }
    }
    for(int i=0;i < j;i++)
    {
        len[i]=strlen(input[i]);
        //printf("%s %d\n",input[i],len[i]);
    }     
    for(int i = 0;i < j-1;i++)
    {
        for(int k=i+1;k < j;k++)
        {          
            if(cmp(input[i],input[k]))
            {
                int temp = len[i]*len[k];
                max = more(temp,max);
            }
        }     
    }
    printf("%d\n",max);
    return 0;
}


C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2021-05-18

#include <stdio.h>
#include <string.h>

int func(char *s1, char *s2)
{
    int arr[26] = {0};
    for(int i=0; i<strlen(s1); i++)
    {
        arr[s1[i]-'a']++;
    }
    int j=0;
    for(j=0; j<strlen(s2); j++)
    {
        if(arr[s2[j]-'a'] != 0){ break; }
    }
    if(j == strlen(s2)){return strlen(s2)*strlen(s1);}
    else{
        return -1;
    }
}

int main(void)
{
    char str[1000] = {0};
    while(scanf("%s", str) != EOF)
    {
        char astr[100][100] = {'\0'};
        int a=0, b=0;
        for(int k=0; k<strlen(str); k++)
        {
            if(str[k]>='a' && str[k]<='z'){
                astr[a][b] = str[k];
                b++;
            }
            else if(str[k] == ','){
                a++;
                b = 0;
            }
        }
        int arr[26] = {0};
        int max = 0;
        for(int i=0; i<=a; i++)
        {
            if(strlen(astr[i]) == 0){ continue; }
            for(int j=i+1; j<=a; j++){
                int ret = func(astr[i], astr[j]);
                if(max < ret){max = ret;}
            }
        }
        printf("%d\n", max);
    }
    
    return 0;
}

上一题