Kiểm tra xâu con đối xứng

Mọi người xem giúp code mình có vấn đề chỗ nào, nó bị sai test cuối cùng.

Đề:

Nhập một xâu. Nhập số lượng query. Mỗi query là một số l là chiều dài xâu con. Kiểm tra với mỗi l, có xâu con nào có độ dài l là xâu đối xứng không.

#include <iostream>
#include <string>
using namespace std;
bool symmetry(string s)
{
    int flag=0;
    for(int i=0; i<s.size()/2; i++)
    {
        if(s[i]!=s[s.size()-1-i]) 
        {
            flag=1;
            break;
        }
    }
    if(flag==0) return true;
    return false;
}
void check(string s, int l)
{
    int x=0;
    for(int j=0; j<s.size()-l+1; j++)
        {
            if(symmetry(s.substr(j, l))) x++;
        }
    if(x==0 || l>s.size()) cout << "0" << endl;
    else cout << "1" << endl;
}
int main()
{
    string s; cin >> s;
    int l, q; cin >> q;
    while(q-->0)
    {
        cin >> l;
        check(s, l);
    }
}
//Cảm ơn mọi người

Test cuối là gì?


Sửa tí: :smiling_imp:

#include <iostream>
#include <string>
using namespace std;
int symmetry(string s) // <---
{
    for(int i=0; i<s.size()/2; i++)
    {
        if(s[i]!=s[s.size()-1-i]) 
        {
            return 0; // <---
        }
    }
    return 1; // <---
}
void check(string s, int l)
{
    int x=0;
    for(int j=0; j<s.size()-l+1; j++)
        {
            x+=symmetry(s.substr(j, l)); // <---
        }
    cout << (x?"1":"0") << endl; // <--- tự for đã kiểm tra cho  l > s.size()
}
int main()
{
    string s; cin >> s;
    int l, q; cin >> q;
    while(q-->0)
    {
        cin >> l;
        check(s, l);
    }
}

đúng 3/4 test, nhưng bị ẩn bạn ạ

Gặp trường hợp tồi tệ thì return false luôn đi, đặt biến flag làm gì cho mệt.

Đây là C++, không phải Pascal.

2 Likes

nếu l là số lẻ thì phần tử ở giữa là gì cũng được?

#include <iostream>
#include <string>
using namespace std;
bool symmetry(string s)
{
	int i = 0, j = s.size() - 1;
	while (i < j)
	{
		if (s[i] != s[j])
			return false;
		i++;
		j--;
	}
	return true;
}

bool check(string s, int l)
{
	if (l > s.size())
		return false;
	int x = 0;
	for (int j = 0; j < s.size() - l; j++)
	{
		if(symmetry(s.substr(j, l)))
			return true;
	}
	return false;
}
int main()
{
	string s; 
	cin >> s;
	unsigned int l, q; 
	cin >> q;
	while (q-->0)
	{
		cin >> l;
		printf(check(s, l) ? "\ntrue" : "\nfalse") ;
	}
	system("Pause");
}

vẫn bị sai :confused:

vậy chỉ còn trường hợp l = 1, hoặc “nếu l lẻ thì xâu không symmetric”, 1 trong 2 cái đó
à l = 0 nữa

2 Likes

đề cho l > 0 và xâu “aba” cũng là xâu đối xứng
sao mình thêm điều kiện (… || l==1) return false thì lại sai thêm 2 test nhỉ

Mình không register được cái web đó
Nhưng mà mình nghĩ l = 1 thì true
chỉ còn trường hợp s.size() = 1

bool check(string s, unsigned int l)
{
	if (l > s.size() || l == 0)
		return false;
	if(s.size() == 1) return true;
...
}

oke để mình thử
à bạn học trường nào thế

Trước mình học MTA, mà nghỉ lâu r :v

sặc thế là anh rồi, em mới năm nhất :v

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?